256 Commits
Author SHA1 Message Date
phantomptr d040883261 Release v7.0.28 2026-10-16 08:27:37 -07:00
phantomptrandClaude Opus 5.5 1260d73094 7z: a failed read of the archive is a read error, not a corrupt archive (#446)
lzma-rust2's range coder reads a failed byte as 1, so any read error on the archive file
surfaces as "dist overflow", the same as a damaged stream. Since 7.0.22 that is classed as
corruption and never retried, so a read that failed once (a phone's storage under load) ended
a 70 GB upload as "the archive is damaged". The archive file is now read through a tap that
keeps the first real read error, and when the decoder then reports corruption, that read
error is what the job sees: an ordinary I/O error the upload retries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3cPwhp3UrzayBfyy9PDcN
2026-10-16 08:21:58 -07:00
phantomptrandClaude Opus 5.5 a61954b5fe ffpfsc unpack: host stand-in for the C tests, rename audit row
The C interop tests build fs_jobs.c, which registers the unpack op; its LVD mount has no
host counterpart, so the host gets a refusal. Its .part -> image rename is a sibling
rename and goes in cross_device.h's audit table.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3cPwhp3UrzayBfyy9PDcN
2026-10-16 08:10:58 -07:00
phantomptr 72da996e8b Merge branch 'worktree-agent-a461a6c996d73ec3c' into release-prep
# Conflicts:
#	client/src/i18n/locales/ar.ts
#	client/src/i18n/locales/bn.ts
#	client/src/i18n/locales/de.ts
#	client/src/i18n/locales/en.ts
#	client/src/i18n/locales/es.ts
#	client/src/i18n/locales/fa.ts
#	client/src/i18n/locales/fr.ts
#	client/src/i18n/locales/hi.ts
#	client/src/i18n/locales/hu.ts
#	client/src/i18n/locales/id.ts
#	client/src/i18n/locales/it.ts
#	client/src/i18n/locales/ja.ts
#	client/src/i18n/locales/ko.ts
#	client/src/i18n/locales/pl.ts
#	client/src/i18n/locales/pt-BR.ts
#	client/src/i18n/locales/ru.ts
#	client/src/i18n/locales/th.ts
#	client/src/i18n/locales/tr.ts
#	client/src/i18n/locales/vi.ts
#	client/src/i18n/locales/zh-CN.ts
#	client/src/i18n/locales/zh-TW.ts
2026-10-16 07:47:51 -07:00
phantomptr 140bd26f0f Merge branch 'worktree-agent-a271b63e8e1248a07' into release-prep 2026-10-16 07:47:27 -07:00
phantomptrandClaude Opus 5.5 1af1a1afa9 Console to console: take over from another device, Test connection (#444)
Pausing a routed send now ends both consoles' halves, so its journal is free
to resume from any device with any helper. The driving engine keeps a shared
record of each send on the receiving console (/data/ps5upload/c2c/<tx>.json)
with a 45 s lease refreshed every 15 s; another device lists those sends
(GET /api/transfer/ps5-to-ps5/remote), takes one over or watches a direct one
(POST /api/transfer/ps5-to-ps5 with adopt: take | watch, same tx_id), and the
engine that had it stops driving without ending anything ("taken over by").

Helper: a new caps bit, CAP_SHARED_JOBS (4). job.status / job.cancel answer
any paired device for uploads and downloads (operations and local copies stay
owner-only), and a JobOpen moves a parked upload of another device to the
opener; an attached one is still refused. SPEC §18.5-18.6.

Test connection in Send to another console runs the console's net.reach probe
from the sending console to the dial target (plus the relay legs, and an
optional real 4 KiB direct send). Tasks shows "Sends from other devices" with
Watch / Take over / Resume here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3cPwhp3UrzayBfyy9PDcN
2026-10-16 07:46:28 -07:00
phantomptrandClaude Opus 5.5 e90dd6e4b4 Decompress a .ffpfsc on the console, decoded by the kernel (#453)
Files gets "Decompress to .exfat…" on a .ffpfsc again. The first build (pulled
before 7.0.23) inflated the blocks in the helper with vendored zlib, and the helper
died with SIGBUS within minutes of loading it; once the console froze. This one has
no decoder: the helper mounts the container read-only the way ShadowMount+ mounts a
.ffpfsc (LVD image type 9, read-only single-save flags, 4096-byte sectors, pfs with
mkeymode=AC), so the kernel decodes it, and copies the file inside to <name>.part,
then renames it in the same folder. The kernel lists that file rounded up to whole
64 KiB blocks; only the inode's real length is copied.

The checks from the first build stay: the container's block table is read before the
kernel sees it, a destination that exists and a drive without room for the image plus
1 GiB are refused, the size and exFAT boot sector are checked before the rename, and
Stop removes the .part and the mount. One unpack runs at a time. The mount is not in
the mount table the helper sees, so it is recorded on the /mnt tmpfs (owner pid, LVD
unit, .part) and a helper that starts after one died mid-copy releases it; a record of
a live instance is left alone.

Measured on the FW 13.60 Phat: a 315 MB image (127 MB container) in 3.5 s and a 4.5 GB
one (3.0 GB container) in 65 s, both byte-identical to the source; Stop, a takeover
mid-copy and a stale record all left no mount, LVD unit or .part behind.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3cPwhp3UrzayBfyy9PDcN
2026-10-16 07:09:42 -07:00
phantomptrandClaude Opus 5.5 cdf46c2e87 Engine: /api/activity reports running jobs and recent endings (#457)
A process-wide hub fed from set_job's terminal write and the unified install's
finish path: running transfers and installs with their progress, and a ring of
the last 64 endings with a monotonic seq so the app's background watcher sees
each one once. POST /api/activity/label lets the client name a job.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3cPwhp3UrzayBfyy9PDcN
2026-10-16 06:45:12 -07:00
phantomptrandClaude Opus 5.5 e0d3bd7851 Status checks name the next step when the helper is down
The management path dropped the job path's specific message (helper port closed with the
loader up, or no loader at all, or a helper too old: #447) and always said "not running or
is an old version". Status, process list and every other management call now carry it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3cPwhp3UrzayBfyy9PDcN
2026-10-16 06:29:07 -07:00
phantomptr 4933f91033 Merge remote-tracking branch 'origin/dependabot/cargo/engine/engine-eb34cac1a2' into deps-2026-10-16 2026-10-16 06:02:17 -07:00
phantomptr bb0e3b6d6b Merge remote-tracking branch 'origin/dependabot/cargo/engine/lz4_flex-0.14.0' into deps-2026-10-16 2026-10-16 06:02:17 -07:00
phantomptr 80e68028a6 Release v7.0.27 2026-10-16 01:09:45 -07:00
phantomptrandClaude Opus 5.5 817bd52213 Stream install: finish on byte coverage, wait out an elfldr swap
A stream install was declared done when the bytes served added up to the
package size. The PS5 re-reads ranges, so on a 37.6 MB package ten 64 KiB
header re-reads equalled a 640 KiB range it had not fetched yet. The
session was released, the console's request for that range got 410, and
the PS5 download failed after ps5upload reported it installed. Coverage is
now an exact interval set, and delivery completes only when every byte
has been served.

"Nothing answered on the ELF loader port :9021" at install start was the
client's background elfldr swap: :9021 is closed for about a second while
the new elfldr replaces the old. The swap, the installer bring-up and the
payload restore now share a per-console lock, and a refused loader port is
retried for 8 s (no bare pre-probe).

Verified on FW 13.60, Phat and Pro: the engine held until the gap was
fetched, with no 410s; an install started inside a swap waited and
succeeded; an 820 MB package installed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K3cPwhp3UrzayBfyy9PDcN
2026-10-16 01:09:40 -07:00
dependabot[bot] 671437e42c Bump lz4_flex from 0.13.1 to 0.14.0 in /engine
Bumps [lz4_flex](https://github.com/pseitz/lz4_flex) from 0.13.1 to 0.14.0.
- [Release notes](https://github.com/pseitz/lz4_flex/releases)
- [Changelog](https://github.com/PSeitz/lz4_flex/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pseitz/lz4_flex/compare/0.13.1...0.14.0)

---
updated-dependencies:
- dependency-name: lz4_flex
  dependency-version: 0.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 06:44:52 +00:00
dependabot[bot] 409a6a8792 Bump the engine group in /engine with 7 updates
Bumps the engine group in /engine with 7 updates:

| Package | From | To |
| --- | --- | --- |
| [serde_json](https://github.com/serde-rs/json) | `1.0.151` | `1.0.154` |
| [uuid](https://github.com/uuid-rs/uuid) | `1.27.0` | `1.28.0` |
| [zeroize](https://github.com/RustCrypto/utils) | `1.9.0` | `1.9.1` |
| [cc](https://github.com/rust-lang/cc-rs) | `1.6.0` | `1.8.0` |
| [sha2](https://github.com/RustCrypto/hashes) | `0.11.0` | `0.11.1` |
| rust-embed | `8.12.0` | `8.13.0` |
| [suppaftp](https://github.com/veeso/suppaftp) | `12.1.1` | `12.2.0` |


Updates `serde_json` from 1.0.151 to 1.0.154
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.151...v1.0.154)

Updates `uuid` from 1.27.0 to 1.28.0
- [Release notes](https://github.com/uuid-rs/uuid/releases)
- [Commits](https://github.com/uuid-rs/uuid/compare/v1.27.0...v1.28.0)

Updates `zeroize` from 1.9.0 to 1.9.1
- [Commits](https://github.com/RustCrypto/utils/compare/zeroize-v1.9.0...zeroize-v1.9.1)

Updates `cc` from 1.6.0 to 1.8.0
- [Release notes](https://github.com/rust-lang/cc-rs/releases)
- [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/cc-rs/compare/cc-v1.6.0...cc-v1.8.0)

Updates `sha2` from 0.11.0 to 0.11.1
- [Commits](https://github.com/RustCrypto/hashes/compare/sha2-v0.11.0...sha2-v0.11.1)

Updates `rust-embed` from 8.12.0 to 8.13.0

Updates `suppaftp` from 12.1.1 to 12.2.0
- [Release notes](https://github.com/veeso/suppaftp/releases)
- [Changelog](https://github.com/veeso/suppaftp/blob/main/CHANGELOG.md)
- [Commits](https://github.com/veeso/suppaftp/compare/v12.1.1...v12.2.0)

---
updated-dependencies:
- dependency-name: serde_json
  dependency-version: 1.0.154
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: engine
- dependency-name: uuid
  dependency-version: 1.28.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: engine
- dependency-name: zeroize
  dependency-version: 1.9.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: engine
- dependency-name: cc
  dependency-version: 1.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: engine
- dependency-name: sha2
  dependency-version: 0.11.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: engine
- dependency-name: rust-embed
  dependency-version: 8.13.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: engine
- dependency-name: suppaftp
  dependency-version: 12.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: engine
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-16 06:44:47 +00:00
phantomptr d74824c886 Release v7.0.26 2026-10-15 18:13:07 -07:00
phantomptrandClaude Opus 5.5 f61f5629e7 Reddit fixes: folder games register with ShadowMount+, resumable stalls, solid-rar retries, PM updates, drag to move
- Receiver writes sce_sys/param.json and param.sfo as .ava-hold and puts them in
  place when the job finishes: ShadowMount+ registered a folder whose eboot.bin
  was still arriving, failed twice and skipped the title for good (repro on
  13.60).
- AVA1 SkipProgress (0x30): a sender reading past data the receiver holds (a
  resumed solid .rar/.7z) keeps the job alive; the console ended it as stalled
  after 900 s on every retry.
- RAR5 unknown-size entries no longer wrap the unpacked total.
- Upload queue: stalled rows offer Restart transfer, stopped/interrupted rows
  offer Resume, "Retry failed uploads" actually runs them and is translated as
  an action.
- Payload Manager tab: Update for payloads stored from the Catalog, keeping the
  boot-list place; repository installs are left to Payload Manager.
- Files: drag folders (and, without drag-out, files) onto a folder or the
  breadcrumb to move them.
- README links the compose file from the feature list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-15 18:05:34 -07:00
phantomptrandClaude Opus 5.5 42403e4892 Collection: a deleted folder no longer breaks saving or scanning (#461)
Saving settings re-checked every root still existed, so once one was
gone nothing could be saved, removing that root included. Only roots
being added are checked now. A scan skips a root it can't open instead
of failing, keeps its caches, and lists it in missing_roots; Collection
names it and Folders marks it "Not found, skipped".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-15 17:06:14 -07:00
phantomptr 08e32214af Release v7.0.25 2026-10-15 12:12:35 -07:00
phantomptrandClaude Opus 5.5 139de00ce3 Profile: drop Create User, it could never work (#460)
13.60's libSceUserService exports no create call, and the old path
(GetInitialUser + SetUserName) only renamed the initial user; in a
payload GetInitialUser fails with 0x80940004. user.create now answers
with "add the user on the PS5" and touches nothing; Profile says so
instead of showing the button.

Also fix the worker-commit crash tests' race: the sender now waits for
credit and stops once the job stopped or finished on its own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-15 12:12:30 -07:00
phantomptr 0b6fb9bfb3 Release v7.0.24 2026-10-15 10:05:18 -07:00
phantomptrandClaude Opus 5.5 0c1aeae1ef Payloads → Ports: the ports in use on the PS5 (Discord ask)
New helper method net.ports (147, frame 265/266): binds each TCP and UDP
port and closes it at once (never connects, so no loader sees a silent
client), then binds 127.0.0.1 and the LAN address to tell network,
console-only and outgoing sockets apart. The socket sysctls
(net.inet.*.pcblist, kern.file) answer ENOENT on FW 13.60. A full pass
takes ~890 ms on the Phat. The engine names well-known ports and the
Payloads screen lists them, with Open only for web UIs and unknown ports.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-15 10:05:11 -07:00
phantomptr 61f6d0e9e8 Release v7.0.23 2026-10-15 00:18:50 -07:00
phantomptrandClaude Opus 5.5 d055239ddb Revert "Decompress a .ffpfsc on the console (#453)"
This reverts commit 1f27c1a560.

Every helper build that linked the vendored zlib died within minutes on a
FW 13.60 Phat with SIGBUS in a system library touching helper code at
zlib's inflateEnd (logged by the new fault detail: addr=0x200161159,
rip=0x88007fe60), most often right after an app kill. One such build was
running when the console went down during a game launch and did not come
back. The same helper without zlib ran through repeated launches and kills.
The decompress op goes back out until it can run without linking zlib into
the helper.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-14 23:51:53 -07:00
phantomptr 58f5535427 Revert "Pin the FFPFSC_UNPACK job op in the schema drift test (#453)"
This reverts commit 742f4cbbc9.
2026-10-14 23:51:43 -07:00
phantomptrandClaude Opus 5.5 742f4cbbc9 Pin the FFPFSC_UNPACK job op in the schema drift test (#453)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-14 20:54:57 -07:00
phantomptrandClaude Opus 5.5 1f27c1a560 Decompress a .ffpfsc on the console (#453)
Files gets "Decompress to .exfat…" on a .ffpfsc. The helper writes the image
the container holds beside it, under the image's own name, and keeps the
source; nothing crosses the network, where the round trip through a computer
was 191 GB of Wi-Fi for a 56 GB container in the report.

The helper (new job op FFPFSC_UNPACK, id 10 in the AVA1 schema) reads the
single-file PFS the way the engine's reader does, inflates each 64 KiB block
with vendored zlib 1.3.1 (inflate side only, third_party/zlib), and writes
<name>.part. It refuses a drive without room for the image plus 1 GiB and a
destination that exists, checks the size and, for an .exfat, the boot
sector, then renames within the folder. Progress and Stop go through the
op-status/op-cancel routes; the engine route is POST /api/ps5/fs/unpack. The
Files screen shows a progress line with Stop and a task. Strings in all 21
locales.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-14 20:32:07 -07:00
phantomptrandClaude Opus 5.5 916ac32883 Grids load scaled covers, not 400 KiB PNGs (#450)
A console's icon0.png is 300-700 KiB at 512 px. The Games tab drew hundreds of
them at card size, and through the macOS data-URL fallback each was a base64
string of the whole file: scrolling stuttered and typing in search stalled.

The icon routes take size=128|256|384. The engine scales the cover once
(JPEG when opaque, PNG when it has transparency) and caches it beside the full
one; on a FW 13.60 Phat a 256 px cover is 15-22 KiB, served from cache in a
few ms. Games cards ask for 384, Library rows and GameIcon for twice their
drawn size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-14 20:06:47 -07:00
phantomptrandClaude Opus 5.5 606950753d Read the ampr_emu 0.3 banner's version (#449)
The 0.3 releases say "0.3.6 (public beta) (c) Drakmor", so the version
reader, which expected digits right before the marker, reported "unknown
version". It now takes the first version token of the whole banner string.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-14 19:43:17 -07:00
phantomptrandClaude Opus 5.5 b7dd979198 Payload Manager 0.6 support: request marker, POST actions, slots (#458)
Payload Manager 0.6.0 refuses a mutation without a same-origin Origin/Referer
unless it carries X-PLDMGR-Request: 1 (403 "Mutation origin or request marker
rejected"), and answers 405 to GET on /loadpayload and /manage:delete. Every
request now carries the marker, and launch/delete are POSTs; 0.5.2 ignores both.

0.6 also moved storage to slots (repo/<id>@<source>, local/<stem>) and lists
them in "items"; its autoload list names slots. The list parser reads items
(with name/version/source) and the Payloads tab keys "Load at boot" by slot,
falling back to the file name on 0.5.

Verified on a FW 13.60 Phat with 0.6.1: overview, store, launch, autoload
add/remove and delete through the engine, and the live installer launch test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-14 19:36:37 -07:00
quer3q f37508feb5 Fast verification by default (#459)
For all type of conversions: packages, images and "Compress and image"
is now using new fast verification.

Toggle can be used to disable this behaviour and enabled full-scan
verification.
2026-10-14 19:36:34 -07:00
phantomptr 01afdf8926 Release v7.0.22 2026-10-12 02:17:36 -07:00
phantomptr f7b411c6db Release v7.0.21 2026-10-12 02:07:18 -07:00
phantomptrandClaude Fable 5.1 8e87800be9 Fix: image format snapped back to .ffpkg; an image can be rewritten as another image format
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-12 02:07:15 -07:00
phantomptr cdda1e0e11 Release v7.0.20 2026-10-12 00:25:25 -07:00
phantomptr 0b9659b436 Release v7.0.19 2026-10-12 00:17:59 -07:00
phantomptrandClaude Fable 5.1 7f6047a332 Fix: the game page crashed when the measuring status reply had no state; refusal test follows the no-AMPR wording
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-12 00:17:56 -07:00
phantomptr 10dd8e8520 Release v7.0.18 2026-10-11 23:38:54 -07:00
phantomptrandClaude Fable 5.1 2be9b2b986 LZ4 packs: install ampr_emu 0.4.2.1 into the image when the game's is missing or old (own copy kept as .orig); a non-AMPR game is pointed at .ffpfsc
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-11 23:38:51 -07:00
phantomptr 6b646d818b Release v7.0.17 2026-10-11 22:47:06 -07:00
phantomptrandClaude Fable 5.1 679d005958 Open a save decrypted and edit its files (save.mount / save.unmount in the helper, pfsmgr + sceFsMountSaveData from a /data copy, write-back only when changed); verified on FW 13.60
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-11 22:47:04 -07:00
phantomptr b74365dbc0 Release v7.0.16 2026-10-11 22:30:52 -07:00
phantomptrandClaude Fable 5.1 40bcd3a9f1 Measure how a game plays and pack it that way: ampr_emu debug build in fakelib2, sessions collected, a profile generated (port of drakmor's ampr_pack_profile.py); i18n gate fix for 7.0.15
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-11 22:30:50 -07:00
phantomptr a0a5edb7a0 Release v7.0.15 2026-10-11 21:58:11 -07:00
phantomptrandClaude Fable 5.1 0036298778 Images regenerate a stale ampr_emu.index (#449), connection says which of three helper states it found (#447), HDR screenshots as 16-bit PQ PNG with cICP (#448)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-11 21:58:08 -07:00
phantomptr b18c7de5a6 Release v7.0.14 2026-10-11 21:16:26 -07:00
phantomptrandClaude Fable 5.1 4d3086d82f Convert: a game on the PS5 or a saved server can become a game image; Options hide package-only choices for an image
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-11 21:08:00 -07:00
phantomptr 774577a499 Release v7.0.13 2026-10-11 20:07:49 -07:00
phantomptrandClaude Fable 5.1 564e757bbe Image read-back check at drive speed, a lighter game page, 7z corruption stops retrying (#446), console-to-console route and dial address (#444)
exFAT reader: FAT held in memory, a cursor so a big file's chain is not re-walked per read,
runs of consecutive clusters read in one call; hashing on all cores; verify_chunk_kib on the
image build request with a Convert preference (8 MiB measured fastest, 169 MiB/s -> 3.7 GiB/s).

Game page: the Overview card that repeated the hero is gone; path, last played and captures
live in the hero; each copy is one compact row with a primary action and an overflow menu.

7z: lzma-rust2 raises "dist overflow" as ErrorKind::Other; it is now a corrupt-archive fault
that names the entry, so the queue stops instead of retrying the same bytes.

Console to console: route auto/direct/relay and an optional dial address per pair, in the
send dialog and the engine request.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EU1Z2mdhAxBrH1yb48pxik
2026-10-11 20:07:43 -07:00
phantomptr b390165ae1 Release v7.0.12 2026-10-11 13:12:51 -07:00