diff --git a/README-es.md b/README-es.md index 9976502..b661fb1 100644 --- a/README-es.md +++ b/README-es.md @@ -46,6 +46,12 @@ Partimos de [seedds/nxnative](https://github.com/seedds/nxnative): el motor, los Entregamos **código, una interfaz de preparación y herramientas de compilación**. El resultado es una app local para Mac o una IPA para iPhone/iPad sin firmar, que firmas e instalas con Sideloadly. No ofrecemos juegos, llaves, firma de Apple ni compatibilidad garantizada con cualquier juego. +## Actualizaciones del motor y multijugador + +Registramos las mejoras del original en el [informe y flujo de mantenimiento](docs/personal-pr-review.md): detección de .NET, empaquetado de pipelines para Mac, reutilización de cachés y detección de regresiones de shaders. Evaluamos por separado los cambios de gráficos y del motor para conservar los juegos que funcionan. + +El motor actual funciona **sin conexión**. No admite los servicios en línea de Nintendo, LAN/netplay ni Windows. Una suscripción a Nintendo Switch Online no los activa aquí. Usar varios controles en un mismo Mac es una función distinta. [Cómo funcionan el código, los mods y la red](docs/development.md#game-binaries-mods-and-networking). + ## Idioma La app inicia en **English**. Cambia a **Español** con el selector de la esquina superior; la elección se guarda en este Mac. Cambia el idioma de la interfaz, no el del juego. Los detalles técnicos se muestran en su idioma original. diff --git a/README.md b/README.md index fd06b80..e0c6980 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,12 @@ Built on [seedds/nxnative](https://github.com/seedds/nxnative). The original pro We provide **source code, a preparation interface and build tools**. The output is a local Mac game app, or an unsigned iPhone/iPad IPA that you sign and install yourself with Sideloadly. Games, console keys, Apple signing and universal game compatibility are not provided. +## Engine updates and multiplayer + +Selected upstream build improvements are recorded in the [review and maintenance flow](docs/personal-pr-review.md): .NET discovery, Mac pipeline packaging, cache reuse and shader regression checks. Graphics/runtime upgrades are evaluated separately to preserve working games. + +The current runtime plays **offline**. Nintendo online services, LAN/netplay and Windows are not supported. A Nintendo Switch Online subscription does not enable them here. Local controllers on one Mac are a separate feature. [How the game code, mods and networking work](docs/development.md#game-binaries-mods-and-networking). + ## Language The app starts in **English**. Choose **Español** using the selector at the top; your selection is remembered on this Mac. This changes the interface language, not the game's language. Build diagnostics keep their original language. diff --git a/desktop/release.json b/desktop/release.json index 187f9a0..316795b 100644 --- a/desktop/release.json +++ b/desktop/release.json @@ -1,5 +1,5 @@ { - "version": "1.4.2", - "build": 7, + "version": "1.4.3", + "build": 8, "minimumMacOSMajor": 26 } diff --git a/docs/development.md b/docs/development.md index 3f0e78b..c5ccdfc 100644 --- a/docs/development.md +++ b/docs/development.md @@ -439,3 +439,42 @@ Each game's notes are in its profile folder, `dm/games//README.md`: what the | `nro_collect.py` | The NRO modules a game registers in its NRRs, found as loose files, among an indexed archive's current files (`data.arc`) or by a scan, written out for the rewriter with `nro.tsv`; online SDKs are listed as refused | | `nvn_slots_got.py` | Builds the NVN fetch table and call sites (GOT-indirect loaders) | | `loader_census.py` | Which of the functions a name loader fetches (glad's GL loader over `eglGetProcAddress`, NVN's C proc loader) the code really calls: the GOT slots or globals the loader stores, loaded by other code (followed through registers, relocated GOT entries and `csel`, for LÖVE's glad) | + +## Game binaries, mods and networking + +The builder does not recover a game's original source project. `patch_nso.py` +rewrites ARM64 NSO images and emits `*.patched.bin` plus fixup/cut tables; the host +loads those images, implements Horizon services and sends graphics through Metal. +The host, launchers, tools and shader translator are editable source. The game +modules remain compiled machine code; identifying Unity, Unreal or another engine +in the survey does not reconstruct its editor project, C# classes, C++ sources, +scene hierarchy or original authoring assets. Unity IL2CPP also compiles game +logic to native code; see the per-game engine table in [dm/games](../dm/games/README.md#games). + +Mods can replace data in formats the game understands or patch instructions for +a verified build ID. `hle_fs.c` already supports `DM_ROMFS_OVERLAY`, searching +overlay roots before the base RomFS; `t_fs.c` exercises that mechanism. This is +a low-level mechanism, not a desktop mod installer or a universal Unity/DLC editor. +Metroid Dread uses MercurySteam's engine and Lua 5.1 bytecode `.lc` scripts, as +recorded in [its game note](../dm/games/010093801237C000/README.md). A custom level, +character or mechanic needs its own asset/script format work and game-version +testing. Existing official DLC packing from the user's files is different from +a user-authored mod; this tool does not publish official DLC or grant source access. + +Networking in this branch and upstream main at `15805ef` is offline: `hle_net.c` +reports no available network and fails socket/SSL service operations; +`hle_offline.c` fails LDN local-wireless initialization; `hle_account.c` provides +a local user but no Nintendo Account/network-service authentication. A Nintendo +Switch Online subscription alone does not implement these missing services. +Mac local multiplayer controllers do not provide LAN, netplay or internet play. +No Jamboree profile exists at that snapshot. Nintendo's [Jamboree multiplayer +guide](https://www.nintendo.com/en-gb/Support/Purchases-Subscriptions/Games/How-to-Start-a-Multiplayer-Game-Super-Mario-Party-Jamboree--2681702.html) +documents offline play on one console and its Nintendo online modes; do not infer +a generic LAN workaround for it. Windows is not a runtime target of this project. + +Future private-room networking would require a deliberate transport/service +implementation, a game supporting that mode, compatible peers, synchronization +and device testing. Remote shared play could instead stream one host's screen +and inputs for supported local-multiplayer games; that is a different project, +not implemented here and not two independently running games joining Nintendo. +Neither route is promised as an upcoming release. diff --git a/docs/personal-ios.md b/docs/personal-ios.md index 6940dee..8a9c914 100644 --- a/docs/personal-ios.md +++ b/docs/personal-ios.md @@ -9,22 +9,25 @@ reported by upstream game notes, not detected from a build or device by this app # Desktop interface -For daily use, open `nxnative.app`, choose a game folder and press **Preparar para iPhone**. -The native macOS interface uses generic SF Symbols instead of game artwork and shows progress and provides buttons for the lightweight IPA, -RomFS folder and Sideloadly. First-time setup still needs full Xcode, Homebrew and the -user's game/key files. It never signs, installs or enters an Apple account. +For daily use, open `~/Applications/nxnative Easy.app`, choose iPhone/iPad or Mac, +select your own game and key folders, and press Prepare game. Cards use existing +repository screenshots. The interface shows progress, cancellation and the output +steps appropriate to the selected target. -To create it on another Mac, double-click `scripts/Abrir-interfaz.command` from the -checkout. Build outputs stay beside the repository, under `nxnative-easy/`; the local -app points back to this checkout, so recreate it if the checkout is moved. The existing -CLI remains available below. Cancellation signals the entire build process group. +On another Mac, run the root `START-HERE.command` or the README's single-command +installer. It keeps an independent checkout and prepared tools in Application +Support, builds the launcher locally with ad-hoc signing and opens it. Full Xcode +must already be installed and opened once. No Apple account is used for these +builds. Source ZIPs can be deleted after setup; games and keys remain external. +Cancellation signals the entire build process group. # Personal iOS builds This branch retains nxnative's MIT license and attribution. It starts from upstream `ecbeae164c0b419d1ba1031248fe1402050a3eb0`, includes the shared iOS touch editor and the tested #277 extraction-space fix, and keeps the working Dread shader -chain. Upstream changes are reviewed in [the PR review](personal-pr-review.md). +chain. Selective upstream packaging/.NET/cache/regression-check imports are tracked +in [the PR review and repeatable sync flow](personal-pr-review.md). ## One command, including lightweight export diff --git a/docs/personal-pr-review.json b/docs/personal-pr-review.json index 38cc11c..6304e64 100644 --- a/docs/personal-pr-review.json +++ b/docs/personal-pr-review.json @@ -737,5 +737,966 @@ } ], "reviewed_at": "2026-10-26T16:51:35.630645+00:00", - "upstream_head": "40b643bbe68861d171cb1a2733a953aa739f9ac1" + "upstream_head": "40b643bbe68861d171cb1a2733a953aa739f9ac1", + "latest_review": { + "reviewed_at": "2026-10-27T01:39:02.543504+00:00", + "upstream_head": "15805ef52578afe54196504e3f98e15a22221664", + "commits_since_base": 38, + "integrated": [ + { + "upstream_sha": "4639c5114cbb8a8f250645941fa3a25c1ba08cc6", + "title": "Pack shader pairs and the offline pipeline archive into Mac apps (#241, #260)" + }, + { + "upstream_sha": "b117c913172120520f01028bd42e3b2d55d9f7af", + "title": "Check translation chain changes on games their author does not own (#272)" + }, + { + "upstream_sha": "89744da75364ba1847dfbd25f5a82a57d8f1ccb1", + "title": "Discover Homebrew .NET runtimes for standalone build tools" + }, + { + "upstream_sha": "09f3778c366fabc2b02b3bf4ae340bb7ce40c2d9", + "title": "Make repeated IPA and Mac app builds incremental (#279)" + } + ], + "open_prs": [ + { + "number": 357, + "head": "07448091977ae1f365b7d896aef78d7ad22ac987", + "title": "launcher: a Picture section, so Game is about the game again", + "url": "https://github.com/seedds/nxnative/pull/357", + "draft": false, + "changed_files": 4, + "changed_since_previous": true, + "assessment": "Launcher UI restructuring overlaps our simplified interface; do not replace our frontend wholesale.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 356, + "head": "4dba64a0ec73606303656f6777714e6a5439649a", + "title": "Mac: DM_ARROWS=camera puts the right stick on the arrow keys", + "url": "https://github.com/seedds/nxnative/pull/356", + "draft": false, + "changed_files": 2, + "changed_since_previous": true, + "assessment": "Optional Mac keyboard camera; test focus loss and simultaneous controller input before adoption.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 355, + "head": "a2e9bf7803d9d0688348db38da170e8efa0796af", + "title": "launcher: sub-settings that appear only when they can do anything (needs column)", + "url": "https://github.com/seedds/nxnative/pull/355", + "draft": false, + "changed_files": 6, + "changed_since_previous": true, + "assessment": "Conditional settings overlap our simpler UI. Evaluate backend settings independently.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 354, + "head": "27a31b57b4292a10ea96b785514da30d88bc6b4d", + "title": "render scale: a per-game ceiling (render_scale_max) instead of a fixed 1.0", + "url": "https://github.com/seedds/nxnative/pull/354", + "draft": false, + "changed_files": 7, + "changed_since_previous": true, + "assessment": "Per-game render scale ceilings affect GPU memory and image quality; need device comparisons.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 352, + "head": "576947788c585d8a8f6ab4251b5558d7b20ce8f7", + "title": "Mac app carries the launcher settings; shader_split.py reports its progress", + "url": "https://github.com/seedds/nxnative/pull/352", + "draft": false, + "changed_files": 12, + "changed_since_previous": true, + "assessment": "Mac launcher configuration and shader progress are useful next tooling candidates; reconcile our app and progress parser.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 351, + "head": "f9dc8b4bb24c35f98a1e54ec378b8034e3891b9b", + "title": "Controller gyro: live six-axis sensor from GameController and the iPhone", + "url": "https://github.com/seedds/nxnative/pull/351", + "draft": false, + "changed_files": 18, + "changed_since_previous": true, + "assessment": "Motion control is relevant for future games; reconcile competing gyro proposals and test real Xbox/PlayStation/Nintendo/device sensors.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 345, + "head": "c37381120a8f8b7aef26fd22db8853dae37d0349", + "title": "present: supersampled upscaling output (DM_PRESENT_UPSCALE_OUT) and sharpening (DM_SHARPEN)", + "url": "https://github.com/seedds/nxnative/pull/345", + "draft": false, + "changed_files": 4, + "changed_since_previous": true, + "assessment": "Optional presentation scaling and sharpening change GPU work and image quality; device validation required.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 344, + "head": "379f147fedad92ffdfcd7e9d228855c4ec391ad0", + "title": "Pipeline prebuild: a compile budget, so one base Apple's compiler never finishes no longer stalls everything (#294)", + "url": "https://github.com/seedds/nxnative/pull/344", + "draft": false, + "changed_files": 9, + "changed_since_previous": true, + "assessment": "Pipeline compiler time budgets can help stalls; verify fallback behavior and archive completeness first.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 343, + "head": "b8afb5b78c1b27e79164e2acae8e8ab22c828135", + "title": "Speed up shader builds and the pipeline prewarm", + "url": "https://github.com/seedds/nxnative/pull/343", + "draft": false, + "changed_files": 13, + "changed_since_previous": true, + "assessment": "Build/prewarm speed candidate with shader cache and pipeline dependencies; keep the chain coherent.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 341, + "head": "21870dcc5b5a022765fe129196d3ee68cdd90247", + "title": "Register Mario Kart 8 Deluxe update 4.0.1", + "url": "https://github.com/seedds/nxnative/pull/341", + "draft": false, + "changed_files": 6, + "changed_since_previous": true, + "assessment": "Exact Mario Kart update profile; needs matching game files and shaders, not an automatic compatibility promise.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 340, + "head": "4d676160f85cf60a135cafd9d5906f43b61bb2b6", + "title": "Batman: Arkham Knight: profile and note (in bring-up; needs #319, #321, #339)", + "url": "https://github.com/seedds/nxnative/pull/340", + "draft": false, + "changed_files": 27, + "changed_since_previous": true, + "assessment": "Batman bring-up depends on other open rendering/UE3 proposals; not ready as an independent game profile.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 339, + "head": "14e5d32fe0514b69b14970c215fb1669586e80da", + "title": "Unreal Engine 3 support: shader caches in the split, shader_key_skip, the UE3 allocator, its frame-rate cap", + "url": "https://github.com/seedds/nxnative/pull/339", + "draft": false, + "changed_files": 15, + "changed_since_previous": true, + "assessment": "UE3 support spans extraction, allocation and timing; needs its own game and malformed-input regression checks.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 337, + "head": "c990da26aed311974e19cb11e4e8eb1753a3a2e7", + "title": "Pin spirv-cross with the translation chain", + "url": "https://github.com/seedds/nxnative/pull/337", + "draft": false, + "changed_files": 24, + "changed_since_previous": true, + "assessment": "Pinning spirv-cross is a reproducibility priority; select binaries matching our retained translation chain.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 336, + "head": "e188fe98c55f07f7d05bea31840d1d50ff3126e3", + "title": "Fix NieR FPS pacing and dynamic resolution controls", + "url": "https://github.com/seedds/nxnative/pull/336", + "draft": true, + "changed_files": 15, + "changed_since_previous": true, + "assessment": "NieR pacing and dynamic resolution require exact-version gameplay and timing checks.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 335, + "head": "af3e3a4fb96cf2ddc65d0b7b2e939b663a666c29", + "title": "samplers: optional anisotropic and trilinear filtering (DM_ANISO, DM_TRILINEAR)", + "url": "https://github.com/seedds/nxnative/pull/335", + "draft": false, + "changed_files": 4, + "changed_since_previous": true, + "assessment": "Optional sampler filtering requires rendering and performance comparison.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 333, + "head": "cee9b90e1ef97614d4fe1436f981a7d8d8a9e878", + "title": "Require the Metal compiler the shaders were tested with", + "url": "https://github.com/seedds/nxnative/pull/333", + "draft": false, + "changed_files": 9, + "changed_since_previous": true, + "assessment": "Pinning the tested Metal compiler is a reproducibility priority; coordinate with Xcode/chain requirements.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 330, + "head": "d7a95500248e5aa5964228335a872d4abf71aaa2", + "title": "Mac: Keyboard and mouse controls for Tears of the Kingdom ", + "url": "https://github.com/seedds/nxnative/pull/330", + "draft": false, + "changed_files": 13, + "changed_since_previous": true, + "assessment": "Game-specific keyboard/mouse aiming; prefer a coherent input policy with real hardware checks.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 327, + "head": "76eb68f887073e0542e36fcdf133d35e5f4d8bd2", + "title": "NSP script: convert NSZ / XCZ with a standalone nsz 5 executable when Python has no nsz", + "url": "https://github.com/seedds/nxnative/pull/327", + "draft": false, + "changed_files": 3, + "changed_since_previous": true, + "assessment": "Standalone NSZ/XCZ converter fallback is a useful next dependency-installation candidate.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 325, + "head": "4a4769e0e4b3bb4cce98e5fae40e11325edc2758", + "title": "Thread dump: the guest callers and registers of a thread waiting in an SVC", + "url": "https://github.com/seedds/nxnative/pull/325", + "draft": false, + "changed_files": 2, + "changed_since_previous": true, + "assessment": "Diagnostic thread dumps can help debugging; assess signal/thread safety before importing runtime code.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 322, + "head": "639e2a97c9e8bd18260aeaeee58703e9e8dfd27a", + "title": "Add Brewfile, requirements.txt, global.json, dependabot, translator l\u2026", + "url": "https://github.com/seedds/nxnative/pull/322", + "draft": false, + "changed_files": 7, + "changed_since_previous": true, + "assessment": "Dependency manifests and pinning are useful, but must match our installer and current translator.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 321, + "head": "0e171b9b1472d3796052122b1d826705ea78fb9a", + "title": "Keep CPU-written textures in the host's hash table, not a CFSet hashed by serial", + "url": "https://github.com/seedds/nxnative/pull/321", + "draft": false, + "changed_files": 8, + "changed_since_previous": true, + "assessment": "Texture tracking changes are core runtime work; run graphics and dirty-resource regressions first.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 320, + "head": "63e294e709a77f3bde5dbdb9272147527bc72658", + "title": "Add Mario + Rabbids Sparks of Hope support with Snowdrop shader extraction and rendering fixes", + "url": "https://github.com/seedds/nxnative/pull/320", + "draft": false, + "changed_files": 32, + "changed_since_previous": true, + "assessment": "Overlaps the already integrated upstream Sparks of Hope port; prefer the coherent upstream main series.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 319, + "head": "833c56641b177dc66dcc5dd15fba19708034e870", + "title": "Copy vertex streams at addresses that are not 4-byte aligned", + "url": "https://github.com/seedds/nxnative/pull/319", + "draft": false, + "changed_files": 6, + "changed_since_previous": true, + "assessment": "Unaligned vertex streams affect general rendering; validate buffer lifetime, bounds and visual output.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 317, + "head": "acdd6e8ff45fad4b782e85eb5f38c5b41de71fc8", + "title": "Wait for the restarted AudioUnit in the audio device-stall test", + "url": "https://github.com/seedds/nxnative/pull/317", + "draft": false, + "changed_files": 1, + "changed_since_previous": true, + "assessment": "Audio-device regression fixture depends on a newer host; import with that audio series.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 314, + "head": "adedb5f535d2bc930cd831ef031bcd510c863654", + "title": "frame step: give a probe 2 s for the GPU clock to come back up", + "url": "https://github.com/seedds/nxnative/pull/314", + "draft": false, + "changed_files": 2, + "changed_since_previous": true, + "assessment": "Frame-step probe timing changes a performance/latency tradeoff; test affected iPhone/iPad models.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 311, + "head": "38915ee7e1f9f3b1e8cf64112b1777cfb8008373", + "title": "Pick the base game's Program NCA, not its update's, from a cartridge dump that carries the update", + "url": "https://github.com/seedds/nxnative/pull/311", + "draft": false, + "changed_files": 4, + "changed_since_previous": true, + "assessment": "Base Program NCA selection in cartridge dumps is an important next extraction candidate; exercise mixed base/update fixtures.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 310, + "head": "c5bf5061bf5798a074de959e604fe4beb198d57e", + "title": "Add iOS 16.1/17 compatibility and tvOS support for Pok\u00e9mon Legends: Z-A", + "url": "https://github.com/seedds/nxnative/pull/310", + "draft": true, + "changed_files": 151, + "changed_since_previous": true, + "assessment": "Older iOS/tvOS support is a separate platform effort; compilation is insufficient to claim device support.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 307, + "head": "15763f525640a9b6a45f3b8924470b5e584bf93c", + "title": "Take the gfx tests' run list and .gitignore from the test sources", + "url": "https://github.com/seedds/nxnative/pull/307", + "draft": false, + "changed_files": 3, + "changed_since_previous": true, + "assessment": "Graphics test discovery is useful maintenance; keep CI without GPU and local GPU tests distinct.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 306, + "head": "a957e6b7368975430e32fe4ab0d4176eaa126386", + "title": "Add issue forms, a pull request template and CONTRIBUTING.md", + "url": "https://github.com/seedds/nxnative/pull/306", + "draft": false, + "changed_files": 6, + "changed_since_previous": true, + "assessment": "Contribution templates are optional repository maintenance, independent of game support.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 304, + "head": "3b32d7d6c3bd06909037e594aecf39d8d6488bb5", + "title": "Add the Hong Kong release of FINAL FANTASY RESONANCE as a game profile", + "url": "https://github.com/seedds/nxnative/pull/304", + "draft": false, + "changed_files": 22, + "changed_since_previous": false, + "assessment": "Newer FFR regional profile includes translator/host defects and claimed iPhone evidence. Avoid stacking #126/#289; chain binaries and tables require full reproducible regression builds.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 303, + "head": "dbf0ab920f7d0e247d13f78cc0b0adbdef36e2ee", + "title": "DM_NVN_POOLPEAK: how full a game's render target pool gets", + "url": "https://github.com/seedds/nxnative/pull/303", + "draft": false, + "changed_files": 7, + "changed_since_previous": true, + "assessment": "Pool high-water tracking can guide memory sizing. Static pool-pointer tracking needs concurrency/lifetime checks; it measures pages ever used, not current live allocations or FPS.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 302, + "head": "ff9727c980c1f51a9f313eb2d3a34f307bcb04ab", + "title": "Pack a Mac app into a disk image with a ready-made window", + "url": "https://github.com/seedds/nxnative/pull/302", + "draft": false, + "changed_files": 3, + "changed_since_previous": false, + "assessment": "DMG window/background automation is useful for Mac distribution, not IPA installation. Finder automation permissions and fallback need testing if Mac delivery becomes a goal.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 301, + "head": "9a0563ccafd4e9d007e3c10d06a84d81d13f7dea", + "title": "Mac: MetalFX frame interpolation (30+30), adapted from MacNativeGames; profile keys scene_upscale / camera_block", + "url": "https://github.com/seedds/nxnative/pull/301", + "draft": false, + "changed_files": 12, + "changed_since_previous": true, + "assessment": "BotW MetalFX interpolation is opt-in and adds latency, frame hooks and game assumptions. Not an iPhone FPS fix; isolate and compare UI/motion artifacts on supported hardware.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 300, + "head": "04d16458249bfa6dd971935d5b6297bfe6fe53a9", + "title": "Keep the automatic block height for sparse textures smaller than a tile", + "url": "https://github.com/seedds/nxnative/pull/300", + "draft": false, + "changed_files": 5, + "changed_since_previous": false, + "assessment": "Sub-tile sparse textures must keep automatic block height. Has synthetic layout tests and a concrete Yoshi symptom; apply with the related sparse-layout series and cross-format tests.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 299, + "head": "28fbf0af4f988bf8eae41292fae5e56805e0b07c", + "title": "Port Good Job! to native Mac", + "url": "https://github.com/seedds/nxnative/pull/299", + "draft": false, + "changed_files": 16, + "changed_since_previous": false, + "assessment": "Good Job combines profile, Unity timing and Mac launcher/window changes. Separate reusable UI from title-specific frame-step patches; Mac metrics do not validate iPhone.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 297, + "head": "7d8cfcee455ee4e4d26292198a0b2f27e66a8357", + "title": "pso_offline: leave pairs metal-tt cannot link to the device", + "url": "https://github.com/seedds/nxnative/pull/297", + "draft": false, + "changed_files": 2, + "changed_since_previous": false, + "assessment": "Leaving unlinkable pairs out can salvage an archive but does not restore missing vertex outputs. Prefer #298's padding fix; also verify cache stamp sensitivity to --leave changes.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 296, + "head": "f1a254912389ad272e93e5b3c5278eb603661325", + "title": "Mac: controller motion (Switch Pro Controller gyro over HID)", + "url": "https://github.com/seedds/nxnative/pull/296", + "draft": false, + "changed_files": 7, + "changed_since_previous": false, + "assessment": "Pro Controller HID supplies motion when GameController reports zero. Reconcile with #221/#286 instead of stacking alternate motion APIs; test calibration, axes, drift and ownership.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 295, + "head": "9a9500bbcb13ac6251d603a5d6b5aa3218bb258b", + "title": "Mac: map a Nintendo controller's face buttons by label", + "url": "https://github.com/seedds/nxnative/pull/295", + "draft": false, + "changed_files": 2, + "changed_since_previous": false, + "assessment": "Nintendo label detection plus override overlaps #180. Candidate for a unified mapping helper; reported Mac Pro Controller test does not validate iOS.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 289, + "head": "7cc835f996f24a5b708cab7d97aad483b9055dc6", + "title": "FINAL FANTASY RESONANCE (Korean release, 0100B8A026F14000): the game's own profile and the full shader table", + "url": "https://github.com/seedds/nxnative/pull/289", + "draft": false, + "changed_files": 31, + "changed_since_previous": true, + "assessment": "Large FFR regional series overlaps #126/#304 and changes common extraction/allocator paths. Compare exact title/build IDs rather than relying on conflicting region labels.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 286, + "head": "0cd0e1658246ecffd79f696aff5583ce430c47eb", + "title": "iOS: six-axis gyro aiming from the controller (and the device in handheld)", + "url": "https://github.com/seedds/nxnative/pull/286", + "draft": false, + "changed_files": 4, + "changed_since_previous": false, + "assessment": "dm_motion_set writes g_mot_t under g_mot_mu, while mot_fresh reads it without that lock. Fix synchronized snapshots and run race/focus/disconnect tests before gyro adoption.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 285, + "head": "e79692b58fa14278c7dc99374c802e0f6364d786", + "title": "Add FINAL FANTASY CRYSTAL CHRONICLES Remastered Edition (1.0.3)", + "url": "https://github.com/seedds/nxnative/pull/285", + "draft": false, + "changed_files": 16, + "changed_since_previous": false, + "assessment": "Crystal Chronicles profile uses build-gated Unity memory-order cuts. Verify registered instruction bytes, worker stress and iPhone behavior; newer Unity TextAsset scanner changes are separately upstream.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 282, + "head": "48192496c8295a971ff92942e3917f1a34858fe2", + "title": "shader_split: one unreadable archive no longer stops the split; retry a crashed Metal compiler", + "url": "https://github.com/seedds/nxnative/pull/282", + "draft": false, + "changed_files": 2, + "changed_since_previous": false, + "assessment": "scan_file catches every Exception and returns an empty shader set, so a build may succeed with omitted shaders. Separate compiler-signal retry from scanner policy; require explicit incomplete-build reporting.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 280, + "head": "05715be61396b8a8b1368212cbeac8b21c1812e5", + "title": "Add native macOS app for building ports and installing on paired iOS devices", + "url": "https://github.com/seedds/nxnative/pull/280", + "draft": false, + "changed_files": 33, + "changed_since_previous": false, + "assessment": "Spanish GUI also includes scheduler, extraction and shader changes and device signing/install. Extract independent fixes; keep unsigned automation and editor base rather than import the whole application.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 278, + "head": "62d2085018f0ba2cfe786e04fccaeec7adc2dbec", + "title": "build_ipa_from_nsp: --platform takes a list, so one run builds the IPA and the Mac app", + "url": "https://github.com/seedds/nxnative/pull/278", + "draft": false, + "changed_files": 4, + "changed_since_previous": true, + "assessment": "Multi-platform CLI is stacked on #275 and carries its target-selection changes. Repair and validate target-specific cache restoration first, then test each platform combination.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 277, + "head": "841684012800327d6d6fa6b6fd79d3ab689c9751", + "title": "Fix NSP extraction space estimates", + "url": "https://github.com/seedds/nxnative/pull/277", + "draft": false, + "changed_files": 2, + "changed_since_previous": false, + "assessment": "Count unique archive paths instead of unique byte sizes. Exact source patch and three synthetic regressions adopted; no shader, game profile or runtime change.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 275, + "head": "f0f966fecba34e941ee43feb643edb7c2e195fec", + "title": "dmsh_build: build only the metallibs a target needs (an iPhone build skips the macOS half)", + "url": "https://github.com/seedds/nxnative/pull/275", + "draft": false, + "changed_files": 4, + "changed_since_previous": true, + "assessment": "cache_outputs gates the entire mac group, including _b.json/_b.metal, when selecting ios only; downstream analysis still consumes those products. Reproduce clean-output cache-hit restoration and fix metadata caching first.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 273, + "head": "028f8b248add4c46de26e02e93110ac5e068fe06", + "title": "Mac host: unrolled-switch jump tables, multi-output transform feedback, MGFX reader tolerance (Silksong, Tale of Immortal, Pokk\u00e9n DX, Stardew Valley)", + "url": "https://github.com/seedds/nxnative/pull/273", + "draft": false, + "changed_files": 23, + "changed_since_previous": false, + "assessment": "Jump-table reach, transform-feedback layout and MGFX tolerance can help several titles. Broad translator/binary changes require chain regeneration and cross-game regression comparisons.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 269, + "head": "0214c68bd3d11abc82bbc4cc9a2305ed56f27603", + "title": "Pok\u00e9mon Violet: profile, Bluetooth LE takeover, ConservativeRasterDilate stub", + "url": "https://github.com/seedds/nxnative/pull/269", + "draft": false, + "changed_files": 20, + "changed_since_previous": true, + "assessment": "Violet profile includes Bluetooth service and rasterization stub. Mac opening evidence plus an acknowledged image-atomic warning does not establish correct iPhone gameplay.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 268, + "head": "c84153fbbbc3625c5a1c0cd7345948bf26cde43f", + "title": "Cheats: an Atmosph\u00e8re-format engine, build-time baking and an in-game menu", + "url": "https://github.com/seedds/nxnative/pull/268", + "draft": false, + "changed_files": 17, + "changed_since_previous": false, + "assessment": "Adds memory writes, executable baking and a runtime menu. Separate from automated builds and compatibility; requires opcode bounds, build matching and pause/thread testing before opt-in adoption.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 265, + "head": "633816faa76f5d4e5350c10ccd8ddeedafc8e2b4", + "title": "Add an opt-in performance overlay to the Mac game window", + "url": "https://github.com/seedds/nxnative/pull/265", + "draft": false, + "changed_files": 17, + "changed_since_previous": false, + "assessment": "HUD counters and system load can help measurements; overlap game profile and host state. Check sampling overhead and thread safety; no demonstrated iPhone FPS gain.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 263, + "head": "46b6aa45112b9f568152dce2bf9be42d68f33e8a", + "title": "Image atomics on buffer images: declared as buffers, and an unbound one gets a buffer placeholder and an atomic scratch of its own (general, from SHIN MEGAMI TENSEI V)", + "url": "https://github.com/seedds/nxnative/pull/263", + "draft": false, + "changed_files": 9, + "changed_since_previous": false, + "assessment": "Buffer-image type and unbound atomic scratch address concrete admission failures. Related fixes now also exist in later upstream commits; compare first to avoid duplicate or older implementations.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 258, + "head": "27339e1e3d4ba82b02dd8f8192e29cdfbba5ed74", + "title": "iOS: add optional swipe camera and touch-control settings", + "url": "https://github.com/seedds/nxnative/pull/258", + "draft": false, + "changed_files": 13, + "changed_since_previous": false, + "assessment": "Swipe camera/deadzone helpers have useful tests but the PR remains draft pending integrated device testing. Reconcile DmGamepad changes with our editor before any merge.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 255, + "head": "988d765d4dbd151c6c4e54ab823c81880e9999aa", + "title": "Save sync through a cloud folder for the Mac and iOS apps (DM_SAVE_SYNC)", + "url": "https://github.com/seedds/nxnative/pull/255", + "draft": false, + "changed_files": 18, + "changed_since_previous": true, + "assessment": "Single-file archives and transaction hooks are a stronger starting point than mixing with #210. Still require interrupted-copy, rollback, conflict and unavailable-cloud tests on disposable saves.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 252, + "head": "ebc3bc409d47379281be1d72e3ed54e948b57112", + "title": "Decode Oodle GFPAKs, fit Arceus's and Z-A 1.0.0's address space, add NVN dual-source blending", + "url": "https://github.com/seedds/nxnative/pull/252", + "draft": false, + "changed_files": 16, + "changed_since_previous": false, + "assessment": "Oodle GFPAKs, address-space cuts and dual-source blending may unlock Arceus/Z-A builds. Requires chain rebuild, precise build gates and visual/gameplay validation.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 239, + "head": "11e1ea58337699e874581ac4b11c19085e47a7bd", + "title": "Mac: default the game language to the Mac's own", + "url": "https://github.com/seedds/nxnative/pull/239", + "draft": false, + "changed_files": 16, + "changed_since_previous": false, + "assessment": "Preferred-language discovery is Mac-only and explicit language wins. Our iOS wrapper persists the selected language already; no iOS benefit from importing this series.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 236, + "head": "dffb26f608f42322bc477c664a5c922213a3ed5b", + "title": "Bring up 30XX: SDK in subsdk modules, GL 4.5 / ES probe, GLSL 1.20, sampler slots", + "url": "https://github.com/seedds/nxnative/pull/236", + "draft": false, + "changed_files": 25, + "changed_since_previous": false, + "assessment": "30XX generalizes SDK discovery to subsdk modules and adds GL/EGL and sampler handling. Run GL shader, SDK discovery and existing NVN/Vulkan regressions before adoption.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 234, + "head": "75fd1b28b8ea798b6642c881e4ecebd28ae7e87e", + "title": "nvn: capture runtime shaders at ProgramSetShaders", + "url": "https://github.com/seedds/nxnative/pull/234", + "draft": false, + "changed_files": 1, + "changed_since_previous": false, + "assessment": "Runtime shader dumping can recover variants missed offline. Validate guest control/code bounds and capture deduplication; keep captured game shaders outside Git.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 233, + "head": "36fc9b37baf8719ee7fbf23d2297877eeefd0f80", + "title": "games: fix War in the North job worker wake", + "url": "https://github.com/seedds/nxnative/pull/233", + "draft": false, + "changed_files": 1, + "changed_since_previous": false, + "assessment": "War in the North changes an event clear-mode instruction. Keep exact build-ID gate; verify worker wake behavior and absence of lost work in that title.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 231, + "head": "69531352b9ee27969d083b187ea2da20d7bc5dee", + "title": "audren: drive a concurrent secondary renderer", + "url": "https://github.com/seedds/nxnative/pull/231", + "draft": false, + "changed_files": 1, + "changed_since_previous": false, + "assessment": "Secondary renderer advances at about 5 ms but its DeviceSink PCM is discarded. Verify this is intended for each game, and test close/join races before general use.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 227, + "head": "2e835c72451da7fc2d9591f065a183b1db6e9efc", + "title": "docs: record Persona 5 Royal Mac build and iPhone installation checkpoint", + "url": "https://github.com/seedds/nxnative/pull/227", + "draft": false, + "changed_files": 1, + "changed_since_previous": false, + "assessment": "Persona 5 note explicitly distinguishes install acceptance from gameplay. Useful evidence, no runtime improvement and no reason to replace the existing recipe.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 221, + "head": "f7c2f2f1054310e5776b1f33cbb401abdcb2b485", + "title": "Add Steam Controller (2026) support on macOS", + "url": "https://github.com/seedds/nxnative/pull/221", + "draft": false, + "changed_files": 21, + "changed_since_previous": false, + "assessment": "Steam controller adds HID, haptics, motion and player ownership. Requires the actual hardware plus multi-controller, reconnect and focus tests; no direct touch-editor benefit.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 218, + "head": "c5923f0ef378e2d39035ad0724a14743c34345f8", + "title": "Yoshi's Crafted World: profile, sparse texture layout, GPU copies into texture storage", + "url": "https://github.com/seedds/nxnative/pull/218", + "draft": false, + "changed_files": 27, + "changed_since_previous": true, + "assessment": "Yoshi needs sparse layouts and GPU writes into texture storage, with Mac evidence. Combine carefully with #300 and rebuild/test shader dependencies before iPhone use.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 216, + "head": "d70e4ac1ad3ef320bcc2f0aec2968d6f5a0163b8", + "title": "Diagnostics: texraw by level, A2C pass-dump fields, probe filter comparisons", + "url": "https://github.com/seedds/nxnative/pull/216", + "draft": false, + "changed_files": 6, + "changed_since_previous": true, + "assessment": "Texture-level dumps, A2C fields and probe comparisons help bring-up. Not a speed feature; check dump boundaries and packaged-resource resolution.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 210, + "head": "acf21eee2fb720d8e3b947f8dfb89c5aa4120b33", + "title": "Save Folder Sync", + "url": "https://github.com/seedds/nxnative/pull/210", + "draft": false, + "changed_files": 11, + "changed_since_previous": true, + "assessment": "Folder import is asynchronous around gameplay startup. Require proof that mounting/game writes cannot race import, plus fault injection and recovery on disposable saves.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 209, + "head": "acdd8dc6c8732409b92a6270b65c33d833984cd2", + "title": "Add NxNative Converter, a native Mac app over the NSP script's mac-app build", + "url": "https://github.com/seedds/nxnative/pull/209", + "draft": false, + "changed_files": 21, + "changed_since_previous": false, + "assessment": "Converter manages dependencies and builds but also signing and engine selection. Preserve this private source checkout and unsigned-only policy if adopting any frontend.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 194, + "head": "e20c2a5f4dc3469c8623a32095c742edab827c1f", + "title": "Mac fullscreen: present without the display link, so 60 fps games no longer drop to 30", + "url": "https://github.com/seedds/nxnative/pull/194", + "draft": false, + "changed_files": 6, + "changed_since_previous": false, + "assessment": "Fullscreen display-link workaround addresses Mac 60-to-30 drops, not demonstrated iPhone behavior. Test fullscreen, variable refresh and pacing regressions.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 193, + "head": "2c859258934dc786f35f4d6c03ffcbca538c664f", + "title": "Super Mario 3D All-Stars: multi-program applications, nn::jit served on iOS, and an opt-in in-process program switch", + "url": "https://github.com/seedds/nxnative/pull/193", + "draft": false, + "changed_files": 106, + "changed_since_previous": false, + "assessment": "3D All-Stars combines multi-program packaging, JIT, services and program switching. Major lifecycle and iOS changes; validate separately, including rejected 32-bit Galaxy path.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 192, + "head": "2d5fd5b29e1e06d03dbe050a104fadbab7729f57", + "title": "Snapshot Mario Wonder's two same-pass feedback draws", + "url": "https://github.com/seedds/nxnative/pull/192", + "draft": false, + "changed_files": 4, + "changed_since_previous": false, + "assessment": "Wonder's two feedback snapshots can address flicker; only affects that profile. Compare affected scenes and GPU/attachment cost on the actual version.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 189, + "head": "e7d470c15244ccaf6f7485dff4e88a03c34a0167", + "title": "Intel Mac: build the shader translator for x86_64 and document the pipeline", + "url": "https://github.com/seedds/nxnative/pull/189", + "draft": false, + "changed_files": 4, + "changed_since_previous": false, + "assessment": "Intel translator launcher can help Intel build hosts, while runtime shader/Oodle capture still needs a native decoder. Do not treat universal launcher as universal game execution.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 188, + "head": "603a60b780c9ab6277ebbf1aac1e0c830884d203", + "title": "Port Blasphemous and Blasphemous 2", + "url": "https://github.com/seedds/nxnative/pull/188", + "draft": false, + "changed_files": 24, + "changed_since_previous": false, + "assessment": "Blasphemous offset-table fallback must remain uniquely bounded; Blasphemous 2 relies on the framed tail-call fix already in the base lineage. Run ambiguity regressions before import.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 186, + "head": "bb517566f820d3bbb809e987081b3b1c1537dc41", + "title": "Add NINJA GAIDEN Sigma profile (0100E2F014F46000)", + "url": "https://github.com/seedds/nxnative/pull/186", + "draft": false, + "changed_files": 16, + "changed_since_previous": false, + "assessment": "Ninja Gaiden adds indexed Team Ninja archive parsing and ReadFile hook. Validate malformed archives, decompressed sizes and SDK ABI along with target-game playback.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 181, + "head": "691dd43ef6d37ce080f0b92c4bc5fccb11f30d05", + "title": "Unicorn Overlord, Asian release (010054B01AD92000, 1.05): game profile", + "url": "https://github.com/seedds/nxnative/pull/181", + "draft": false, + "changed_files": 9, + "changed_since_previous": false, + "assessment": "Asian Unicorn Overlord has independent title/build IDs and reportedly identical shader data. Import only for that release, verify build registration and profile tests.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 180, + "head": "fccf98362334b51d0935d4c443b7d1f354ce0f71", + "title": "Map Nintendo controller face buttons by label on macOS and iOS", + "url": "https://github.com/seedds/nxnative/pull/180", + "draft": false, + "changed_files": 2, + "changed_since_previous": false, + "assessment": "Nintendo label detection is small and relevant on iOS, but overlaps #295 on Mac. Test Pro/Joy-Con and Xbox/PlayStation hardware before changing mappings.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 179, + "head": "f661323a779d545e76aab50e62fc3f2914e68ec5", + "title": "Add physical keyboard support on iOS", + "url": "https://github.com/seedds/nxnative/pull/179", + "draft": false, + "changed_files": 1, + "changed_since_previous": false, + "assessment": "Physical keyboard support changes control visibility and focus cleanup. Must retain editor access and test keyboard/controller connect, disconnect and stale callbacks together.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 176, + "head": "887a4f058ebfe72e950d6701e5971cb2a9f4cdea", + "title": "Trails in the Sky 1st Chapter (01001E9023920000, update 1.0.6.1): game profile, plus general fixes to the rewriter, the GLSLC split, the shader build and the NVN layer", + "url": "https://github.com/seedds/nxnative/pull/176", + "draft": false, + "changed_files": 23, + "changed_since_previous": false, + "assessment": "Trails adds rewriter, scanner and NVN changes as well as a region-specific profile. Rebuild shader chain and check exact regional build; IPA build alone is not gameplay validation.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 173, + "head": "f5e632cf5f89fb94d000ebe843a75209dc282eff", + "title": "SHIN MEGAMI TENSEI V (010063B012DC6000, 1.0.0): game profile, version 8 Unreal paks, sparse virtual pools, 60 fps and an iOS Screen setting", + "url": "https://github.com/seedds/nxnative/pull/173", + "draft": false, + "changed_files": 40, + "changed_since_previous": false, + "assessment": "SMT V combines profile, sparse pools and iOS aspect modes; depends on #263. The aspect changes also touch the editor's coordinate assumptions and need device testing.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 171, + "head": "52c5daa90308ece5b1420625520d62bc7c02b759", + "title": "Add native SM and CSRNG IPC transport", + "url": "https://github.com/seedds/nxnative/pull/171", + "draft": false, + "changed_files": 14, + "changed_since_previous": false, + "assessment": "Native SM/CSRNG transport can reduce SDK symbol interceptions. Large service-memory and handle-lifetime surface; run adversarial IPC and thread-safety tests before replacing working paths.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 167, + "head": "e4dc169c7662685677b47d5a067ebcd6c9647223", + "title": "Textures: upload CPU-written linear and unflushed sampled textures", + "url": "https://github.com/seedds/nxnative/pull/167", + "draft": false, + "changed_files": 2, + "changed_since_previous": false, + "assessment": "CPU-written linear and unflushed sampled texture upload paths can help several games. Requires dirty-page, alias and CPU/GPU synchronization regressions before adoption.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 160, + "head": "bdbf8eb2c8542cd7851690ff7224bd27221d1d56", + "title": "Xenoblade Chronicles 2 (0100F3400332C000, JP 3.0.0, SDK 3.5) on the Mac host, with Torna", + "url": "https://github.com/seedds/nxnative/pull/160", + "draft": false, + "changed_files": 20, + "changed_since_previous": false, + "assessment": "Xenoblade 2/Torna adds SDK 3.5, audio, movie and frame-step behavior. Mac evidence does not validate iOS memory or frame timing.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 126, + "head": "309722488d994df048b5750f82ad13e451a0cac5", + "title": "FINAL FANTASY RESONANCE HK 1.0.1 (0100B8A026F14000): the game profile", + "url": "https://github.com/seedds/nxnative/pull/126", + "draft": false, + "changed_files": 9, + "changed_since_previous": false, + "assessment": "Same title ID overlaps #289/#304; compare builds and regenerated tables. Prefer the newer, smaller validated profile series rather than stacking all three.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 104, + "head": "48c615d25dd4b23202a884eb948acbf1878cf3bd", + "title": "Mac: native AppKit app bundle, preferences, and controller mapping", + "url": "https://github.com/seedds/nxnative/pull/104", + "draft": false, + "changed_files": 9, + "changed_since_previous": false, + "assessment": "Mac app packaging, save locations and preferences overlap already-existing upstream Mac packaging. Reconcile save migration and current packer before considering it.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 102, + "head": "36afdfa288937333cc467463db32267f79cc1d2d", + "title": "Mac: add optional Xbox letter-based controller mapping", + "url": "https://github.com/seedds/nxnative/pull/102", + "draft": false, + "changed_files": 2, + "changed_since_previous": false, + "assessment": "Xbox label preference is opt-in and overlaps Nintendo detection proposals #180/#295. Choose one mapping policy, then test real controllers.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 76, + "head": "40460d2d49725ee9f28fd1613bb54ddbc3184159", + "title": "Breath of the Wild above 60 fps and above 1080p (reworked from #62)", + "url": "https://github.com/seedds/nxnative/pull/76", + "draft": false, + "changed_files": 26, + "changed_since_previous": true, + "assessment": "BotW variable frame step and resolution changes require exact registered builds and timing tests. No established Dread benefit; higher caps also need thermal validation.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 32, + "head": "0c0d8f3d1709a906c980576e6b75ef50327f4cea", + "title": "NVN: alpha test through a fragment variant; parallel prewarm; alpha-tested pipelines built in the background", + "url": "https://github.com/seedds/nxnative/pull/32", + "draft": false, + "changed_files": 4, + "changed_since_previous": false, + "assessment": "Alpha-test variants can fix foliage, but first-use draws are deliberately skipped while compilation runs. Requires scene comparisons and cold/warm cache tests before adoption.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + }, + { + "number": 29, + "head": "c117972a2513fe2819779965954a47e06bd6fcef", + "title": "Rhythm Heaven Groove: A16 legacy support, touch pad and ambient bars", + "url": "https://github.com/seedds/nxnative/pull/29", + "draft": false, + "changed_files": 28, + "changed_since_previous": false, + "assessment": "A16 BC decoding and rhythm-specific controls are bundled together; retain generic editor and separate bundle identity deliberately. Requires older iPhone texture, memory and touch testing.", + "scope": "Static metadata and changed-file inventory; archived patch is not approval or device testing." + } + ], + "scope": "Source review and synthetic checks for four selected tooling commits; other commits and open PRs remain applicability triage." + } } diff --git a/docs/personal-pr-review.md b/docs/personal-pr-review.md index bac65b8..ae009fc 100644 --- a/docs/personal-pr-review.md +++ b/docs/personal-pr-review.md @@ -1,3 +1,192 @@ +# Upstream maintenance: latest selective integration + +Snapshot captured on 2026-10-26 (America/Mexico_City), pinned to upstream +`15805ef52578afe54196504e3f98e15a22221664`: 38 commits since our base and 85 open +PRs. Commit inventories were compared and the four tooling changes below received +source review and synthetic tests. Open PR metadata and file inventories are +archived; this is not a line-by-line audit of all 85 proposals or their generated +tables. The historical review below retains its original snapshot and limitations. +The machine-readable latest review is in [personal-pr-review.json](personal-pr-review.json). + +## Integrated tooling + +| Upstream commit | Result | +|---|---| +| `4639c5114cbb` (#241/#260) | Pack shader/pipeline pair tables and optional GPU pipeline archive into complete Mac apps. | +| `b117c9131721` (#272) | Compare shader build reports and stop when previously translated shaders regress. | +| `89744da75364` (#284) | Discover Homebrew .NET runtimes correctly for standalone build tools. | +| `09f3778c366f` (#279) | Incremental IPA and Mac packaging and derived-profile cache reuse, with atomic publication checks. | + +The runtime, shared touch editor, game profiles and translator/chain header remain +at our working base. The current chain is `8393d85a4eae`. The two cherry-pick +conflicts preserved our README and the existing FINAL FANTASY RESONANCE note: +that note's later graphics claim depends on changes we did not import. +No game files, keys, installed game identities or saves were changed. + +Incremental final packaging needs the same output path. Our simple wrappers still +produce separate dated outputs to preserve previous builds; their intermediate +profile/shader caches benefit, but do not promise that the final app/IPA is reused +across those different names. Direct core builds with the same output reuse it. +The upstream IPA index trusts unchanged APFS metadata; `--no-reuse` on the packer +forces a fresh archive. It does not detect old archive corruption during reuse. +Our lightweight export retains its CRC verification. + +## Validation of this batch + +The 100 focused .NET, Mac packaging, incremental IPA and shader-regression tests +passed before integration. The final candidate passed 48 Python test files +(352 test cases, 16 skipped for unavailable optional fixtures), using the prepared +build environment. The production iOS project compiled and linked unsigned with +synthetic Metroid Dread-profile modules; this exercises the shared touch editor +and host linkage, not gameplay. The updated Mac launcher compiled with the macOS +SDK. No prepared game was rebuilt, launched or installed during this audit. +The fork owner's successful iPhone and Mac gameplay report preceded this batch; +it is user-reported evidence, not a new automated device test. + +## Deferred work + +- Runtime changes: startup notification deadlock (`0963959`), save transaction + isolation (`a0841d6`), audio/device/layout (`40b643b`, `15805ef`), scripted versus + controller input (`583ae42`). Useful, but require the associated host tests and + fresh gameplay checks; not mixed into the validated engine automatically. +- Graphics and new game series: image atomics, texture aliasing, display pacing, + pipeline padding, Unity/HAL extraction and eight new profiles. Those share a + translation chain and need coherent imports plus cross-game rendering checks. +- Developer tooling: upstream regression/impact harness (#328/#329), compiler + pinning (#333/#337), base-NCA selection (#311), NSZ fallback (#327), faster + builds (#343/#344). Evaluate as separate batches with their dependencies. +- Optional features: controller gyro (#351/#286/#296), cheats (#268), save sync + (#210/#255). Gyro needs hardware checks; cheats need exact-build/code-page + safeguards; sync needs destructive failure/conflict/recovery tests. Not enabled. +- Networking remains offline in both our runtime and the reviewed upstream main; + no Jamboree profile was found. Local multiplayer controllers are different from + LAN/netplay or Nintendo's online service. + +## Repeatable flow + +Use the repository's existing installer once to prepare tools, then: + +```sh +python3 scripts/sync_upstream.py --output "/Volumes/Games/review-next" +``` + +This fetches upstream, freezes its head SHA and writes a commit/file/risk report. +It distinguishes the reviewed head from the actually integrated commits recorded +in [upstream-sync.json](upstream-sync.json). It never merges the active branch. +To test explicitly selected SHAs, in dependency order: + +```sh +python3 scripts/sync_upstream.py --output "/Volumes/Games/candidate-next" --stage FULL_SHA [ANOTHER_SHA] +``` + +The second command rejects dirty source checkouts, integrated/non-upstream commits +and creates a detached candidate worktree. Conflicts remain there for inspection; +the active checkout stays intact. It finds the prepared Python environment and +runs all synthetic personal, tool, iOS and graphics Python checks into `checks/`. +Missing dependencies or failed checks stop the flow. Review logs, compile affected +targets and test games/devices before integrating. A passed synthetic test suite +is not a claim of gameplay compatibility or approval to publish a release. +Register newly accepted upstream SHAs in the policy, then bump the desktop release +manifest when distributing changed functionality through the in-app updater. + +For a separate archive of every open PR and its pinned patch, use: + +```sh +python3 scripts/review_upstream.py --output "/Volumes/Games/pr-review-next" +``` + +## Latest open PR inventory + +| PR | Pinned head | Applicability | +|---|---|---| +| [#29](https://github.com/seedds/nxnative/pull/29) | `c117972a2513` | A16 BC decoding and rhythm-specific controls are bundled together; retain generic editor and separate bundle identity deliberately. Requires older iPhone texture, memory and touch testing. | +| [#32](https://github.com/seedds/nxnative/pull/32) | `0c0d8f3d1709` | Alpha-test variants can fix foliage, but first-use draws are deliberately skipped while compilation runs. Requires scene comparisons and cold/warm cache tests before adoption. | +| [#76](https://github.com/seedds/nxnative/pull/76) | `40460d2d4972` | BotW variable frame step and resolution changes require exact registered builds and timing tests. No established Dread benefit; higher caps also need thermal validation. | +| [#102](https://github.com/seedds/nxnative/pull/102) | `36afdfa28893` | Xbox label preference is opt-in and overlaps Nintendo detection proposals #180/#295. Choose one mapping policy, then test real controllers. | +| [#104](https://github.com/seedds/nxnative/pull/104) | `48c615d25dd4` | Mac app packaging, save locations and preferences overlap already-existing upstream Mac packaging. Reconcile save migration and current packer before considering it. | +| [#126](https://github.com/seedds/nxnative/pull/126) | `309722488d99` | Same title ID overlaps #289/#304; compare builds and regenerated tables. Prefer the newer, smaller validated profile series rather than stacking all three. | +| [#160](https://github.com/seedds/nxnative/pull/160) | `bdbf8eb2c854` | Xenoblade 2/Torna adds SDK 3.5, audio, movie and frame-step behavior. Mac evidence does not validate iOS memory or frame timing. | +| [#167](https://github.com/seedds/nxnative/pull/167) | `e4dc169c7662` | CPU-written linear and unflushed sampled texture upload paths can help several games. Requires dirty-page, alias and CPU/GPU synchronization regressions before adoption. | +| [#171](https://github.com/seedds/nxnative/pull/171) | `52c5daa90308` | Native SM/CSRNG transport can reduce SDK symbol interceptions. Large service-memory and handle-lifetime surface; run adversarial IPC and thread-safety tests before replacing working paths. | +| [#173](https://github.com/seedds/nxnative/pull/173) | `f5e632cf5f89` | SMT V combines profile, sparse pools and iOS aspect modes; depends on #263. The aspect changes also touch the editor's coordinate assumptions and need device testing. | +| [#176](https://github.com/seedds/nxnative/pull/176) | `887a4f058ebf` | Trails adds rewriter, scanner and NVN changes as well as a region-specific profile. Rebuild shader chain and check exact regional build; IPA build alone is not gameplay validation. | +| [#179](https://github.com/seedds/nxnative/pull/179) | `f661323a779d` | Physical keyboard support changes control visibility and focus cleanup. Must retain editor access and test keyboard/controller connect, disconnect and stale callbacks together. | +| [#180](https://github.com/seedds/nxnative/pull/180) | `fccf98362334` | Nintendo label detection is small and relevant on iOS, but overlaps #295 on Mac. Test Pro/Joy-Con and Xbox/PlayStation hardware before changing mappings. | +| [#181](https://github.com/seedds/nxnative/pull/181) | `691dd43ef6d3` | Asian Unicorn Overlord has independent title/build IDs and reportedly identical shader data. Import only for that release, verify build registration and profile tests. | +| [#186](https://github.com/seedds/nxnative/pull/186) | `bb517566f820` | Ninja Gaiden adds indexed Team Ninja archive parsing and ReadFile hook. Validate malformed archives, decompressed sizes and SDK ABI along with target-game playback. | +| [#188](https://github.com/seedds/nxnative/pull/188) | `603a60b780c9` | Blasphemous offset-table fallback must remain uniquely bounded; Blasphemous 2 relies on the framed tail-call fix already in the base lineage. Run ambiguity regressions before import. | +| [#189](https://github.com/seedds/nxnative/pull/189) | `e7d470c15244` | Intel translator launcher can help Intel build hosts, while runtime shader/Oodle capture still needs a native decoder. Do not treat universal launcher as universal game execution. | +| [#192](https://github.com/seedds/nxnative/pull/192) | `2d5fd5b29e1e` | Wonder's two feedback snapshots can address flicker; only affects that profile. Compare affected scenes and GPU/attachment cost on the actual version. | +| [#193](https://github.com/seedds/nxnative/pull/193) | `2c859258934d` | 3D All-Stars combines multi-program packaging, JIT, services and program switching. Major lifecycle and iOS changes; validate separately, including rejected 32-bit Galaxy path. | +| [#194](https://github.com/seedds/nxnative/pull/194) | `e20c2a5f4dc3` | Fullscreen display-link workaround addresses Mac 60-to-30 drops, not demonstrated iPhone behavior. Test fullscreen, variable refresh and pacing regressions. | +| [#209](https://github.com/seedds/nxnative/pull/209) | `acdd8dc6c873` | Converter manages dependencies and builds but also signing and engine selection. Preserve this private source checkout and unsigned-only policy if adopting any frontend. | +| [#210](https://github.com/seedds/nxnative/pull/210) | `acf21eee2fb7` | Folder import is asynchronous around gameplay startup. Require proof that mounting/game writes cannot race import, plus fault injection and recovery on disposable saves. | +| [#216](https://github.com/seedds/nxnative/pull/216) | `d70e4ac1ad3e` | Texture-level dumps, A2C fields and probe comparisons help bring-up. Not a speed feature; check dump boundaries and packaged-resource resolution. | +| [#218](https://github.com/seedds/nxnative/pull/218) | `c5923f0ef378` | Yoshi needs sparse layouts and GPU writes into texture storage, with Mac evidence. Combine carefully with #300 and rebuild/test shader dependencies before iPhone use. | +| [#221](https://github.com/seedds/nxnative/pull/221) | `f7c2f2f10543` | Steam controller adds HID, haptics, motion and player ownership. Requires the actual hardware plus multi-controller, reconnect and focus tests; no direct touch-editor benefit. | +| [#227](https://github.com/seedds/nxnative/pull/227) | `2e835c72451d` | Persona 5 note explicitly distinguishes install acceptance from gameplay. Useful evidence, no runtime improvement and no reason to replace the existing recipe. | +| [#231](https://github.com/seedds/nxnative/pull/231) | `69531352b9ee` | Secondary renderer advances at about 5 ms but its DeviceSink PCM is discarded. Verify this is intended for each game, and test close/join races before general use. | +| [#233](https://github.com/seedds/nxnative/pull/233) | `36fc9b37baf8` | War in the North changes an event clear-mode instruction. Keep exact build-ID gate; verify worker wake behavior and absence of lost work in that title. | +| [#234](https://github.com/seedds/nxnative/pull/234) | `75fd1b28b8ea` | Runtime shader dumping can recover variants missed offline. Validate guest control/code bounds and capture deduplication; keep captured game shaders outside Git. | +| [#236](https://github.com/seedds/nxnative/pull/236) | `dffb26f608f4` | 30XX generalizes SDK discovery to subsdk modules and adds GL/EGL and sampler handling. Run GL shader, SDK discovery and existing NVN/Vulkan regressions before adoption. | +| [#239](https://github.com/seedds/nxnative/pull/239) | `11e1ea583376` | Preferred-language discovery is Mac-only and explicit language wins. Our iOS wrapper persists the selected language already; no iOS benefit from importing this series. | +| [#252](https://github.com/seedds/nxnative/pull/252) | `ebc3bc409d47` | Oodle GFPAKs, address-space cuts and dual-source blending may unlock Arceus/Z-A builds. Requires chain rebuild, precise build gates and visual/gameplay validation. | +| [#255](https://github.com/seedds/nxnative/pull/255) | `988d765d4dbd` | Single-file archives and transaction hooks are a stronger starting point than mixing with #210. Still require interrupted-copy, rollback, conflict and unavailable-cloud tests on disposable saves. | +| [#258](https://github.com/seedds/nxnative/pull/258) | `27339e1e3d4b` | Swipe camera/deadzone helpers have useful tests but the PR remains draft pending integrated device testing. Reconcile DmGamepad changes with our editor before any merge. | +| [#263](https://github.com/seedds/nxnative/pull/263) | `46b6aa45112b` | Buffer-image type and unbound atomic scratch address concrete admission failures. Related fixes now also exist in later upstream commits; compare first to avoid duplicate or older implementations. | +| [#265](https://github.com/seedds/nxnative/pull/265) | `633816faa76f` | HUD counters and system load can help measurements; overlap game profile and host state. Check sampling overhead and thread safety; no demonstrated iPhone FPS gain. | +| [#268](https://github.com/seedds/nxnative/pull/268) | `c84153fbbbc3` | Adds memory writes, executable baking and a runtime menu. Separate from automated builds and compatibility; requires opcode bounds, build matching and pause/thread testing before opt-in adoption. | +| [#269](https://github.com/seedds/nxnative/pull/269) | `0214c68bd3d1` | Violet profile includes Bluetooth service and rasterization stub. Mac opening evidence plus an acknowledged image-atomic warning does not establish correct iPhone gameplay. | +| [#273](https://github.com/seedds/nxnative/pull/273) | `028f8b248add` | Jump-table reach, transform-feedback layout and MGFX tolerance can help several titles. Broad translator/binary changes require chain regeneration and cross-game regression comparisons. | +| [#275](https://github.com/seedds/nxnative/pull/275) | `f0f966fecba3` | cache_outputs gates the entire mac group, including _b.json/_b.metal, when selecting ios only; downstream analysis still consumes those products. Reproduce clean-output cache-hit restoration and fix metadata caching first. | +| [#277](https://github.com/seedds/nxnative/pull/277) | `841684012800` | Count unique archive paths instead of unique byte sizes. Exact source patch and three synthetic regressions adopted; no shader, game profile or runtime change. | +| [#278](https://github.com/seedds/nxnative/pull/278) | `62d2085018f0` | Multi-platform CLI is stacked on #275 and carries its target-selection changes. Repair and validate target-specific cache restoration first, then test each platform combination. | +| [#280](https://github.com/seedds/nxnative/pull/280) | `05715be61396` | Spanish GUI also includes scheduler, extraction and shader changes and device signing/install. Extract independent fixes; keep unsigned automation and editor base rather than import the whole application. | +| [#282](https://github.com/seedds/nxnative/pull/282) | `48192496c829` | scan_file catches every Exception and returns an empty shader set, so a build may succeed with omitted shaders. Separate compiler-signal retry from scanner policy; require explicit incomplete-build reporting. | +| [#285](https://github.com/seedds/nxnative/pull/285) | `e79692b58fa1` | Crystal Chronicles profile uses build-gated Unity memory-order cuts. Verify registered instruction bytes, worker stress and iPhone behavior; newer Unity TextAsset scanner changes are separately upstream. | +| [#286](https://github.com/seedds/nxnative/pull/286) | `0cd0e1658246` | dm_motion_set writes g_mot_t under g_mot_mu, while mot_fresh reads it without that lock. Fix synchronized snapshots and run race/focus/disconnect tests before gyro adoption. | +| [#289](https://github.com/seedds/nxnative/pull/289) | `7cc835f996f2` | Large FFR regional series overlaps #126/#304 and changes common extraction/allocator paths. Compare exact title/build IDs rather than relying on conflicting region labels. | +| [#295](https://github.com/seedds/nxnative/pull/295) | `9a9500bbcb13` | Nintendo label detection plus override overlaps #180. Candidate for a unified mapping helper; reported Mac Pro Controller test does not validate iOS. | +| [#296](https://github.com/seedds/nxnative/pull/296) | `f1a254912389` | Pro Controller HID supplies motion when GameController reports zero. Reconcile with #221/#286 instead of stacking alternate motion APIs; test calibration, axes, drift and ownership. | +| [#297](https://github.com/seedds/nxnative/pull/297) | `7d8cfcee455e` | Leaving unlinkable pairs out can salvage an archive but does not restore missing vertex outputs. Prefer #298's padding fix; also verify cache stamp sensitivity to --leave changes. | +| [#299](https://github.com/seedds/nxnative/pull/299) | `28fbf0af4f98` | Good Job combines profile, Unity timing and Mac launcher/window changes. Separate reusable UI from title-specific frame-step patches; Mac metrics do not validate iPhone. | +| [#300](https://github.com/seedds/nxnative/pull/300) | `04d16458249b` | Sub-tile sparse textures must keep automatic block height. Has synthetic layout tests and a concrete Yoshi symptom; apply with the related sparse-layout series and cross-format tests. | +| [#301](https://github.com/seedds/nxnative/pull/301) | `9a0563ccafd4` | BotW MetalFX interpolation is opt-in and adds latency, frame hooks and game assumptions. Not an iPhone FPS fix; isolate and compare UI/motion artifacts on supported hardware. | +| [#302](https://github.com/seedds/nxnative/pull/302) | `ff9727c980c1` | DMG window/background automation is useful for Mac distribution, not IPA installation. Finder automation permissions and fallback need testing if Mac delivery becomes a goal. | +| [#303](https://github.com/seedds/nxnative/pull/303) | `dbf0ab920f7d` | Pool high-water tracking can guide memory sizing. Static pool-pointer tracking needs concurrency/lifetime checks; it measures pages ever used, not current live allocations or FPS. | +| [#304](https://github.com/seedds/nxnative/pull/304) | `3b32d7d6c3bd` | Newer FFR regional profile includes translator/host defects and claimed iPhone evidence. Avoid stacking #126/#289; chain binaries and tables require full reproducible regression builds. | +| [#306](https://github.com/seedds/nxnative/pull/306) | `a957e6b73689` | Contribution templates are optional repository maintenance, independent of game support. | +| [#307](https://github.com/seedds/nxnative/pull/307) | `15763f525640` | Graphics test discovery is useful maintenance; keep CI without GPU and local GPU tests distinct. | +| [#310](https://github.com/seedds/nxnative/pull/310) | `c5bf5061bf57` | Older iOS/tvOS support is a separate platform effort; compilation is insufficient to claim device support. | +| [#311](https://github.com/seedds/nxnative/pull/311) | `38915ee7e1f9` | Base Program NCA selection in cartridge dumps is an important next extraction candidate; exercise mixed base/update fixtures. | +| [#314](https://github.com/seedds/nxnative/pull/314) | `adedb5f535d2` | Frame-step probe timing changes a performance/latency tradeoff; test affected iPhone/iPad models. | +| [#317](https://github.com/seedds/nxnative/pull/317) | `acdd6e8ff45f` | Audio-device regression fixture depends on a newer host; import with that audio series. | +| [#319](https://github.com/seedds/nxnative/pull/319) | `833c56641b17` | Unaligned vertex streams affect general rendering; validate buffer lifetime, bounds and visual output. | +| [#320](https://github.com/seedds/nxnative/pull/320) | `63e294e709a7` | Overlaps the already integrated upstream Sparks of Hope port; prefer the coherent upstream main series. | +| [#321](https://github.com/seedds/nxnative/pull/321) | `0e171b9b1472` | Texture tracking changes are core runtime work; run graphics and dirty-resource regressions first. | +| [#322](https://github.com/seedds/nxnative/pull/322) | `639e2a97c9e8` | Dependency manifests and pinning are useful, but must match our installer and current translator. | +| [#325](https://github.com/seedds/nxnative/pull/325) | `4a4769e0e4b3` | Diagnostic thread dumps can help debugging; assess signal/thread safety before importing runtime code. | +| [#327](https://github.com/seedds/nxnative/pull/327) | `76eb68f88707` | Standalone NSZ/XCZ converter fallback is a useful next dependency-installation candidate. | +| [#330](https://github.com/seedds/nxnative/pull/330) | `d7a95500248e` | Game-specific keyboard/mouse aiming; prefer a coherent input policy with real hardware checks. | +| [#333](https://github.com/seedds/nxnative/pull/333) | `cee9b90e1ef9` | Pinning the tested Metal compiler is a reproducibility priority; coordinate with Xcode/chain requirements. | +| [#335](https://github.com/seedds/nxnative/pull/335) | `af3e3a4fb96c` | Optional sampler filtering requires rendering and performance comparison. | +| [#336](https://github.com/seedds/nxnative/pull/336) | `e188fe98c55f` | NieR pacing and dynamic resolution require exact-version gameplay and timing checks. | +| [#337](https://github.com/seedds/nxnative/pull/337) | `c990da26aed3` | Pinning spirv-cross is a reproducibility priority; select binaries matching our retained translation chain. | +| [#339](https://github.com/seedds/nxnative/pull/339) | `14e5d32fe051` | UE3 support spans extraction, allocation and timing; needs its own game and malformed-input regression checks. | +| [#340](https://github.com/seedds/nxnative/pull/340) | `4d676160f85c` | Batman bring-up depends on other open rendering/UE3 proposals; not ready as an independent game profile. | +| [#341](https://github.com/seedds/nxnative/pull/341) | `21870dcc5b5a` | Exact Mario Kart update profile; needs matching game files and shaders, not an automatic compatibility promise. | +| [#343](https://github.com/seedds/nxnative/pull/343) | `b8afb5b78c1b` | Build/prewarm speed candidate with shader cache and pipeline dependencies; keep the chain coherent. | +| [#344](https://github.com/seedds/nxnative/pull/344) | `379f147fedad` | Pipeline compiler time budgets can help stalls; verify fallback behavior and archive completeness first. | +| [#345](https://github.com/seedds/nxnative/pull/345) | `c37381120a8f` | Optional presentation scaling and sharpening change GPU work and image quality; device validation required. | +| [#351](https://github.com/seedds/nxnative/pull/351) | `f9dc8b4bb24c` | Motion control is relevant for future games; reconcile competing gyro proposals and test real Xbox/PlayStation/Nintendo/device sensors. | +| [#352](https://github.com/seedds/nxnative/pull/352) | `576947788c58` | Mac launcher configuration and shader progress are useful next tooling candidates; reconcile our app and progress parser. | +| [#354](https://github.com/seedds/nxnative/pull/354) | `27a31b57b429` | Per-game render scale ceilings affect GPU memory and image quality; need device comparisons. | +| [#355](https://github.com/seedds/nxnative/pull/355) | `a2e9bf7803d9` | Conditional settings overlap our simpler UI. Evaluate backend settings independently. | +| [#356](https://github.com/seedds/nxnative/pull/356) | `4dba64a0ec73` | Optional Mac keyboard camera; test focus loss and simultaneous controller input before adoption. | +| [#357](https://github.com/seedds/nxnative/pull/357) | `07448091977a` | Launcher UI restructuring overlaps our simplified interface; do not replace our frontend wholesale. | + +--- + # Personal iOS branch: upstream review, 2026-10-26 Scope: all 57 PRs open at the captured snapshot, plus the 20 upstream commits after diff --git a/docs/upstream-sync.json b/docs/upstream-sync.json new file mode 100644 index 0000000..485fb46 --- /dev/null +++ b/docs/upstream-sync.json @@ -0,0 +1,25 @@ +{ + "schema": 1, + "repository": "seedds/nxnative", + "baseline": "ecbeae164c0b419d1ba1031248fe1402050a3eb0", + "reviewed_head": "15805ef52578afe54196504e3f98e15a22221664", + "integrated": [ + { + "upstream_sha": "4639c5114cbb8a8f250645941fa3a25c1ba08cc6", + "title": "Pack shader pairs and the offline pipeline archive into Mac apps (#241, #260)" + }, + { + "upstream_sha": "b117c913172120520f01028bd42e3b2d55d9f7af", + "title": "Check translation chain changes on games their author does not own (#272)" + }, + { + "upstream_sha": "89744da75364ba1847dfbd25f5a82a57d8f1ccb1", + "title": "Discover Homebrew .NET runtimes for standalone build tools" + }, + { + "upstream_sha": "09f3778c366fabc2b02b3bf4ae340bb7ce40c2d9", + "title": "Make repeated IPA and Mac app builds incremental (#279)" + } + ], + "note": "Selective tooling imports, not a merge of all upstream history. Runtime and translation chain remain at the baseline." +} diff --git a/scripts/sync_upstream.py b/scripts/sync_upstream.py new file mode 100644 index 0000000..a8621dd --- /dev/null +++ b/scripts/sync_upstream.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python3 +"""Review upstream or test selected commits in a separate checkout; never merge the active branch.""" +import argparse +from datetime import datetime, timezone +import json +from pathlib import Path +import subprocess +import sys + +ROOT=Path(__file__).resolve().parents[1] +POLICY=ROOT/'docs/upstream-sync.json' + + +def git(root,*args): + return subprocess.check_output(['git','-C',str(root),*args],text=True).strip() + + +def areas(files): + groups=[] + for label,prefixes in [('graphics',('dm/gfx/',)),('runtime/saves/input',('dm/host/','dm/ios/Dm','dm/ios/Game')), + ('game profiles',('dm/games/',)),('build tooling',('scripts/','dm/mac/','dm/ios/tools/','dm/tools/'))]: + if any(f.startswith(prefixes) for f in files):groups.append(label) + return groups or ['documentation/tests/CI'] + + +def commits(root,base,head,integrated): + result=[] + for line in git(root,'log','--reverse','--format=%H\t%s',base+'..'+head).splitlines(): + sha,title=line.split('\t',1) + files=git(root,'diff-tree','--root','--no-commit-id','--name-only','-r',sha).splitlines() + result.append(dict(sha=sha,title=title,areas=areas(files),files=files, + status='integrated' if sha in integrated else 'needs review')) + return result + + +def stage(root,destination,head,selected,integrated): + # Resolve and validate every request before creating or cherry-picking anything. + if git(root,'status','--porcelain'):raise ValueError('Commit or stash local edits before staging; nothing was changed.') + resolved=[] + for revision in selected: + if revision.startswith('-'):raise ValueError('Expected an upstream commit SHA.') + sha=git(root,'rev-parse','--verify',revision+'^{commit}') + if sha in integrated:raise ValueError('This upstream commit is already recorded as integrated: '+sha) + if subprocess.run(['git','-C',str(root),'merge-base','--is-ancestor',sha,head]).returncode: + raise ValueError('Requested commit is not in the pinned upstream history: '+sha) + if sha in resolved:raise ValueError('Duplicate commit: '+sha) + resolved.append(sha) + git(root,'worktree','add','--detach',str(destination),'HEAD') + # On conflict leave the candidate and Git's conflict state for inspection. The active checkout is untouched. + subprocess.run(['git','-C',str(destination),'cherry-pick','-x',*resolved],check=True) + + +def build_python(): + candidates=[Path(sys.executable),ROOT.parent/'venv/bin/python', + Path.home()/'Library/Application Support/nxnative Easy/Tools/nxnative-tools/venv/bin/python'] + for python in candidates: + if python.is_file() and subprocess.run([str(python),'-c','import capstone, lz4, fontTools'], + stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL).returncode==0: + return str(python) + raise ValueError('Build-test packages are missing. Run START-HERE.command once, then retry this command.') + + +def validate(candidate,output,python): + env=__import__('os').environ.copy();env.setdefault('DM_GAME','010015100B514000') + logs=output/'checks';logs.mkdir() + suites=['scripts/tests','dm/tools/tests','dm/ios/tests','dm/gfx/tests'] + for suite in suites: + for test in sorted((candidate/suite).glob('test_*.py')): + relative=test.relative_to(candidate) + with (logs/str(relative).replace('/','_')).with_suffix('.log').open('w') as log: + subprocess.run([python,'-m','unittest',str(relative)],cwd=candidate,env=env, + stdout=log,stderr=subprocess.STDOUT,check=True) + # Passing synthetic checks is not gameplay validation or permission to publish a release. + + +def main(argv=None): + parser=argparse.ArgumentParser(description=__doc__) + parser.add_argument('--output',required=True,type=Path,help='new directory outside this checkout') + parser.add_argument('--stage',nargs='+',metavar='SHA',help='explicitly reviewed commits, in dependency order; stage and run synthetic checks') + args=parser.parse_args(argv) + output=args.output.expanduser().resolve() + if output==ROOT or ROOT in output.parents or output.exists():parser.error('Choose a new folder outside the source checkout.') + policy=json.loads(POLICY.read_text()) + remote=git(ROOT,'remote','get-url','upstream').removesuffix('.git') + if remote not in ('https://github.com/seedds/nxnative','git@github.com:seedds/nxnative'): + parser.error('The upstream remote does not point to seedds/nxnative; no files changed.') + git(ROOT,'fetch','upstream','main') + head=git(ROOT,'rev-parse','FETCH_HEAD') + integrated={item['upstream_sha'] for item in policy['integrated']} + rows=commits(ROOT,policy['baseline'],head,integrated) + output.mkdir(parents=True) + report=dict(reviewed_at=datetime.now(timezone.utc).isoformat(),upstream_head=head,baseline=policy['baseline'], + local_head=git(ROOT,'rev-parse','HEAD'),commits=rows,candidate_status='not staged') + report_path=output/'report.json' + def save():report_path.write_text(json.dumps(report,indent=2)+'\n') + save() + lines=['# Upstream review','','Pinned upstream: `'+head+'`. No active branch or game files changed.','', + '| Commit | Status | Areas | Change |','|---|---|---|---|'] + for row in rows: + title=row['title'].replace('|','/').replace('\n',' ') + lines.append(f"| `{row['sha'][:12]}` | {row['status']} | {', '.join(row['areas'])} | {title} |") + (output/'report.md').write_text('\n'.join(lines)+'\n') + print('Review:',output/'report.md',flush=True) + if args.stage: + report['requested_commits']=args.stage;report['candidate_status']='staging';save() + try: + python=build_python() + stage(ROOT,output/'candidate',head,args.stage,integrated) + report['candidate_status']='checking';save() + validate(output/'candidate',output) + report['candidate_status']='synthetic checks passed; gameplay and release review still required';save() + except Exception: + report['candidate_status']='failed; inspect candidate and checks, active checkout preserved';save();raise + print('Candidate:',output/'candidate') + print('Inspect changes, compile affected targets and test games before integration.') + else: + print('To evaluate selected commits, run again with a new --output folder and --stage SHA [SHA ...].') + return 0 + + +if __name__=='__main__': + try:sys.exit(main()) + except (ValueError,OSError,subprocess.SubprocessError) as error: + print('Error:',error,file=sys.stderr);sys.exit(1) diff --git a/scripts/tests/test_upstream_sync.py b/scripts/tests/test_upstream_sync.py new file mode 100644 index 0000000..0140abd --- /dev/null +++ b/scripts/tests/test_upstream_sync.py @@ -0,0 +1,60 @@ +"""Selected upstream changes stay isolated from the active checkout, even on conflicts.""" +import importlib.util +from pathlib import Path +import subprocess +import tempfile +import unittest + +ROOT=Path(__file__).resolve().parents[2] +spec=importlib.util.spec_from_file_location('sync_upstream',ROOT/'scripts/sync_upstream.py') +sync=importlib.util.module_from_spec(spec);spec.loader.exec_module(sync) + +class UpstreamSync(unittest.TestCase): + def setUp(self): + self.temp=tempfile.TemporaryDirectory();self.addCleanup(self.temp.cleanup) + self.root=Path(self.temp.name)/'repo';self.root.mkdir() + sync.git(self.root,'init','-b','main') + sync.git(self.root,'config','user.name','Test') + sync.git(self.root,'config','user.email','test@example.invalid') + (self.root/'file').write_text('base\n');self.commit('base');self.base=sync.git(self.root,'rev-parse','HEAD') + sync.git(self.root,'switch','-c','upstream') + (self.root/'file').write_text('upstream\n');self.commit('upstream');self.upstream=sync.git(self.root,'rev-parse','HEAD') + sync.git(self.root,'switch','main') + self.candidate=Path(self.temp.name)/'candidate' + + def commit(self,message): + sync.git(self.root,'add','.');sync.git(self.root,'commit','-m',message) + + def test_stage_preserves_active_checkout(self): + sync.stage(self.root,self.candidate,self.upstream,[self.upstream],set()) + self.assertEqual((self.candidate/'file').read_text(),'upstream\n') + self.assertEqual((self.root/'file').read_text(),'base\n') + self.assertEqual(sync.git(self.root,'rev-parse','HEAD'),self.base) + self.assertIn(self.upstream,sync.git(self.candidate,'log','-1','--format=%B')) + + def test_dirty_checkout_is_preserved(self): + (self.root/'file').write_text('local edits\n') + with self.assertRaises(ValueError):sync.stage(self.root,self.candidate,self.upstream,[self.upstream],set()) + self.assertFalse(self.candidate.exists()) + self.assertEqual((self.root/'file').read_text(),'local edits\n') + + def test_conflict_stays_in_candidate(self): + (self.root/'file').write_text('fork\n');self.commit('fork') + with self.assertRaises(subprocess.CalledProcessError):sync.stage(self.root,self.candidate,self.upstream,[self.upstream],set()) + self.assertEqual((self.root/'file').read_text(),'fork\n') + self.assertEqual(sync.git(self.root,'status','--porcelain'),'') + self.assertIn('UU file',sync.git(self.candidate,'status','--porcelain')) + + def test_rejects_integrated_and_non_upstream_requests_before_staging(self): + (self.root/'local').write_text('fork');self.commit('fork');local=sync.git(self.root,'rev-parse','HEAD') + for revision,integrated in ((self.upstream,{self.upstream}),(local,set()),('--help',set())): + with self.subTest(revision=revision),self.assertRaises(ValueError): + sync.stage(self.root,self.candidate,self.upstream,[revision],integrated) + self.assertFalse(self.candidate.exists()) + + def test_report_keeps_review_separate_from_integration(self): + rows=sync.commits(self.root,self.base,self.upstream,set()) + self.assertEqual(rows[0]['status'],'needs review') + self.assertEqual(sync.commits(self.root,self.base,self.upstream,{self.upstream})[0]['status'],'integrated') + self.assertIn('graphics',sync.areas(['dm/gfx/nvn/file.c'])) + self.assertIn('runtime/saves/input',sync.areas(['dm/host/hle_fs.c']))