[PR #7186] feat(unity): inventory Addressables content catalogs #7705

Open
opened 2026-11-03 13:39:46 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/7186
Author: @8rulerstar
Created: 10/26/2026
Status: 🔄 Open

Base: main ← Head: feat/unity-addressables-catalog


📝 Commits (10+)

  • c7519d2 feat(unity): decode Addressables catalogs into keys, locations and bundle facts
  • 3cfce05 feat(unity): expose inspect_unity_addressables through MCP, CLI and views
  • 120f24e docs(unity): document Addressables catalog inspection
  • 3d7f172 chore(unity): merge latest main into feat/unity-addressables-catalog
  • d4e4af1 docs(unity): list Addressables in the Romanian and Urdu READMEs
  • 97e1b3b test(unity): compare the retained catalog with Buffer.equals
  • d335bbd refactor(unity): validate absolute catalog paths in the shared input schema
  • 48fdea2 fix(unity): let the service report MCP input errors by field
  • 61ab664 fix(unity): keep an unreadable binary type name unknown
  • 34695a2 fix(unity): count dependency-only binary locations before admitting rows

📊 Changes

71 files changed (+5187 additions, -46 deletions)

View changed files

📝 .agents/skills/reverse-engineer-anything/SKILL.md (+7 -0)
📝 .agents/skills/reverse-engineer-anything/references/native-and-artifacts.md (+11 -0)
📝 README.md (+1 -0)
📝 docs/.vitepress/config.ts (+1 -0)
📝 docs/cli.md (+11 -0)
📝 docs/readme/README_ar.md (+1 -0)
📝 docs/readme/README_de.md (+1 -0)
📝 docs/readme/README_el.md (+1 -0)
📝 docs/readme/README_es.md (+1 -0)
📝 docs/readme/README_fa.md (+1 -0)
📝 docs/readme/README_fr.md (+1 -0)
📝 docs/readme/README_id.md (+1 -0)
📝 docs/readme/README_it.md (+1 -0)
📝 docs/readme/README_ja.md (+1 -0)
📝 docs/readme/README_ko.md (+1 -0)
📝 docs/readme/README_ml.md (+1 -0)
📝 docs/readme/README_pl.md (+1 -0)
📝 docs/readme/README_pt-BR.md (+1 -0)
📝 docs/readme/README_ro.md (+1 -0)
📝 docs/readme/README_ru.md (+1 -0)

...and 51 more files

📄 Description

Thank you for the IL2CPP and artifact readers this builds on; it follows the same reader, Evidence and view shape.

Summary

Unity games that use Addressables ship a content catalog (catalog.json, or catalog.bin from Addressables 2.x on). It maps every load key to a bundle or asset location, with its provider, its dependencies and the bundle's recorded hash and CRC. rea has no reader for it. This adds inspect_unity_addressables (CLI inspect-unity-addressables), a static, read-only inventory of one local catalog, with retained Evidence pages through inspect_analysis_view kind unity-addressables. Related: #3607 (Unity umbrella); it does not close it.

Problem and expected behavior

Use case: an agent looking at a Unity build wants to know which bundle holds Prefabs/Crate, which bundles it depends on, where those bundles are expected ({UnityEngine.AddressableAssets.Addressables.RuntimePath}/... or a remote URL) and their recorded hash and CRC, without Unity. Expected: keys with their encoding and selected locations; locations with primary key, internal id, provider id, resource type, dependencies as location indices and bundle options; provider records; locator id and build result hash. Optional hash_path records a catalog.hash file's text.

Change and scope

  • src/unity/UnityAddressablesJsonCatalog.ts: JsonUtility catalogs (base64 key, bucket, entry and extra data; prefix-compressed internal ids expanded).
  • src/unity/UnityAddressablesBinaryCatalog.ts: BinaryStorageBuffer catalogs with header version 2 (Addressables 2.x) and 3 (4.x, checked with 4.1.1). Locations are numbered in first-reference order (key sets, then dependency sets), the key table is admitted before any location set is decoded, and every dependency set is followed before the final row counts are admitted. Version 1, behind the optional ENABLE_BINARY_CATALOG define in 1.21/1.22, is refused as unsupported because no built sample was checked.
  • The decoder is chosen from content, not the file name. Shared offset arrays are decoded once; text is checked before expansion and each row is charged before retention; loops yield every 256 rows.
  • Failures come from one reason table: unsupported (unrecognized format, unsupported version), malformed (JSON, base64, record bounds, indices, object tags, strings, string-chain cycles and overlapping chain nodes) and capacity (the input and report allowances, named on the refusal).
  • Input paths use the shared absoluteLocalPathStringSchema, and the MCP tool is registered with applicationToolRegistrationOptions like IL2CPP, so the service builds field-level input errors.
  • src/domain/analysisView/indexedRowPage.ts: the IL2CPP metadata view and the new view share one indexed row pager instead of two copies.

Not included: opening or downloading bundles, resolving runtime placeholders, recomputing catalog.hash or bundle CRCs, writing or patching catalogs, decoding location data other than asset bundle request options (its type name is reported), or a reverse index from a bundle to the keys and locations that depend on it (callers page locations and invert dependencies).

Follow the contribution scope. Scope decision: pending. This is a new tool that reads one caller-selected local file (plus an optional hash file).

Contract and boundary impact

  • Semantic owner and earliest changed stage: format decoders in src/unity/; facts and validation in src/domain/unity/unityAddressables.ts; delivery in UnityAddressablesService. The IL2CPP view now uses the shared indexedRowPage.ts; its own pager copy was removed.
  • Contribution scope fit and linked maintainer decision: pending (see above).
  • CLI and MCP/tool-catalog contract: new tool inspect_unity_addressables (path, detail, optional hash_path), new CLI command with --hash, new view kind unity-addressables (collections keys, locations, providers).
  • Provider, bridge, target-format, or platform compatibility: built-in, no external tool, all platforms.
  • Evidence, artifact, provenance, or reconstruction contract: JSON Evidence is derived (dependencies resolved through the dependency key, as the runtime locator does); binary Evidence is observed. Failures keep a source observation with artifact identity and declared row counts; once the decoded catalog fits the report budget, later failures keep it as catalog Evidence with any completed catalog.hash facts.
  • Target selection, authority, upstream behavior, and cleanup details (if applicable): one caller-selected regular file (plus an optional hash file of at most 4 KiB), stable snapshot, one inspection per reader, close releases file handles.
  • Generated metadata (docs/public/product-catalog.json), package, or installation impact: none committed; npm run docs:check passes.

Expected effects (check known effects; use documentation-only on its own).
Unchecked items do not establish absence; leave uncertainties visible.

  • Read existing files or captured data.
  • Launch or attach to a process.
  • Inject instrumentation or run scripts/code.
  • Change process memory, registers, files, or configuration.
  • Contact network services.
  • Recover protected code or work around protections.
  • Documentation or usability only; no target interaction.
  • Not sure yet; investigation or maintainer guidance needed.

Evidence and regression coverage

  • Tests added or updated: decoder boundaries (every JSON key encoding, binary v2/v3 equal to the JSON facts, shared location sets, dependency-only locations, refusals per reason), provider (identity, hash file, typed failures with source Evidence, report budget, later failures that keep the decoded catalog and a completed hash file, one active inspection, cancellation), view (summary counts, intersecting filters, sealed reuse, validator cross-checks), service, a failed or cancelled hash file close in the shared stable-read tests, one CLI/MCP acceptance test, one MCP boundary test for field-level input errors, and the shared relative-path schema test. All fixtures are authored bytes that follow the Addressables package sources.

  • Base reproduction or other evidence: contributor-reported verification against catalogs built in batch mode from a small authored project. For each catalog, rea's keys, locations, dependencies and bundle hash/CRC/name/size were compared with what the package's own catalog loader returned in the same editor:

    Catalog Unity / Addressables SHA-256 (prefix) Result
    catalog.json (local) 2022.3.62f3 / 1.22.3 43f72223 key pairs 25/25, locations 10/10
    catalog_sample.json (remote copy, with .hash) 2022.3.62f3 / 1.22.3 43f72223 25/25, 10/10
    catalog.bin header v2 (with .hash) 6000.4.1f1 / 2.10.3 97318198 18/18, 10/10
    catalog.bin header v3 (with .hash) 6000.4.1f1 / 4.1.1 3f4a2821 18/18, 10/10

    The remote catalog_sample.json is a byte-identical copy of the local catalog in this build, so it adds the .hash path, not a second catalog. The comparison script reports a difference for each of four edits to the loader output (one CRC digit, one dependency removed, one key renamed, one JSON dependency hash changed).

  • User-visible CLI/MCP output (if applicable): rea inspect-unity-addressables catalog.bin --hash catalog.hash --format json on the v3 catalog, abridged to the catalog fields, one key and two locations (shown one per line; the output is one JSON document):

    {"format":"binary","format_version":3,"locator_id":"AddressablesMainContentCatalog","build_result_hash":"83f8806ba058ec59b05bb58865fa6ee7","dependency_basis":"location-records"}
    {"kind":"string","value":"Prefabs/Crate","type_name":null,"locations":[1]}
    {"primary_key":"Prefabs/Crate","internal_id":"Assets/Samples/Crate.prefab","provider_id":"UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider","resource_type":"UnityEngine.GameObject","dependencies":[7,6,5],"dependency_key":null,"dependency_hash":0,"data":null,"offset":1918}
    {"primary_key":"gameplay_assets_prefabs_crate_ef357d631f13122442699a42caad2843.bundle","internal_id":"{UnityEngine.AddressableAssets.Addressables.RuntimePath}/StandaloneOSX/gameplay_assets_prefabs_crate_ef357d631f13122442699a42caad2843.bundle","provider_id":"UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider","resource_type":"UnityEngine.ResourceManagement.ResourceProviders.IAssetBundleResource","dependencies":[],"dependency_key":null,"dependency_hash":0,"data":{"kind":"asset-bundle","hash":"ef357d631f13122442699a42caad2843","crc":104324149,"bundle_name":"0222775c35e348650dfbc5a64e44ac8d","bundle_size":3346},"offset":1795}
    

    bundle_name is the AssetBundle's internal name, which can differ from the file name; hash matches the file name suffix. In binary catalogs dependency_hash is the stored value; the runtime computes its own.

  • Remaining proof gaps: binary version 1; Addressables releases other than the three checked; large production catalogs (not measured); catalog.hash is reported, not verified (it did not match an MD5 of the catalog, and I did not reproduce the package's hash).

For evidence-bearing changes:

  • Observed, derived, and inferred claims remain distinguishable.
  • Artifact identity, source provenance, and failed attempts remain preserved.
  • Unsupported, incomplete, unavailable, or uncertain outcomes remain visible.

Validation performed

Head d96f2eb4c (main merged at 317bf3fe2), Windows 11, Node 24.19.0, below the engines floor 24.22.1 (dependencies installed with --engine-strict=false):

  • npm run check:fast (typecheck and lint, 0 errors) and oxfmt --check on the changed files: passed.
  • vitest run on five Unity Addressables test files and tests/process-global/stableArtifactConsumers.test.ts: 241 passed. The four new tests fail on the previous head.
  • Not run locally: tests/acceptance/unityAddressablesCli.test.ts needs a build, and the build needs the Windows native controls, which this checkout does not have. CI covers it.

Earlier, head 1594b9c24, merged with main 1173c0a9d:

  • npm run typecheck, npm run lint (0 errors), npm run format:check, npm run metadata:check, npm run docs:check: passed.
  • Changed test files (vitest run on the 7 files in this diff): 79 passed. jscpd: 3.63%, the same as main (threshold 4%).
  • Rebuilt CLI against the four catalogs in the table above: key pairs 25/25, 25/25, 18/18, 18/18 and locations 10/10 each, no differences. Not repeated for d96f2eb4c, which changes failure handling and report assembly, not decoding.
  • Full vitest run locally: stopped before completion. My Node 26.5.0 is below the new engines floor (26.12.1), and the failures seen before stopping were outside Unity (SQLite, AppleScript, Node SEA, plist). I am relying on CI for the full suite.

Compatibility, safety, and release

  • Breaking changes or migration steps: none; new tool, CLI command and view kind only.
  • Real Hopper/Ghidra, browser, or OS coverage: not applicable (built-in reader). Real catalogs were built and compared on macOS only.
  • Package or release metadata impact: none committed; generated catalogs are produced by CI.
  • Security, privacy, process, or containment review: reads one caller-selected file and an optional hash file; no execution, network or writes. Catalog text is bounded before expansion and the report is bounded before retention.

Author readiness

Human owner: @8rulerstar

  • I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work.
  • I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps.
  • I declare this PR ready for initial maintainer review.

Before merge

  • This PR addresses a concrete problem or an agreed enhancement.
  • Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff.
  • The PR has one focused outcome and the title follows type(scope): outcome.
  • Related issue is linked, or the reason for not linking one is stated above.
  • Tests cover changed observable behavior and meaningful failure paths.
  • Owning docs, contracts, and generated metadata are updated where needed.
  • User-visible CLI/MCP changes include representative output.
  • I checked the final diff for secrets, unrelated cleanup, and unsupported claims.

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/morluto/rea/pull/7186 **Author:** [@8rulerstar](https://github.com/8rulerstar) **Created:** 10/26/2026 **Status:** 🔄 Open **Base:** `main` ← **Head:** `feat/unity-addressables-catalog` --- ### 📝 Commits (10+) - [`c7519d2`](https://github.com/morluto/rea/commit/c7519d24ef60048c1e1be59b72bb115f2a81bca0) feat(unity): decode Addressables catalogs into keys, locations and bundle facts - [`3cfce05`](https://github.com/morluto/rea/commit/3cfce05e7c56348f55a5577fa49a3922c9286965) feat(unity): expose inspect_unity_addressables through MCP, CLI and views - [`120f24e`](https://github.com/morluto/rea/commit/120f24eb5ffa03c0ca9532782c86095f30a37f7e) docs(unity): document Addressables catalog inspection - [`3d7f172`](https://github.com/morluto/rea/commit/3d7f1728a058f025665fffd401af35adb40dc402) chore(unity): merge latest main into feat/unity-addressables-catalog - [`d4e4af1`](https://github.com/morluto/rea/commit/d4e4af1b692a52bd003865d69bf6884b4bc23397) docs(unity): list Addressables in the Romanian and Urdu READMEs - [`97e1b3b`](https://github.com/morluto/rea/commit/97e1b3be869c28fc50eca6b64673b928f11abb36) test(unity): compare the retained catalog with Buffer.equals - [`d335bbd`](https://github.com/morluto/rea/commit/d335bbd13d26f0e3a22fcad52b6500ef447f4b08) refactor(unity): validate absolute catalog paths in the shared input schema - [`48fdea2`](https://github.com/morluto/rea/commit/48fdea26ee8befba893ba1aae3ad5d1ea5270c19) fix(unity): let the service report MCP input errors by field - [`61ab664`](https://github.com/morluto/rea/commit/61ab664760bcdc73f67cc7e8a56b3dd3c49a8152) fix(unity): keep an unreadable binary type name unknown - [`34695a2`](https://github.com/morluto/rea/commit/34695a2c7626ef0fa6ae921c36db51cda911d943) fix(unity): count dependency-only binary locations before admitting rows ### 📊 Changes **71 files changed** (+5187 additions, -46 deletions) <details> <summary>View changed files</summary> 📝 `.agents/skills/reverse-engineer-anything/SKILL.md` (+7 -0) 📝 `.agents/skills/reverse-engineer-anything/references/native-and-artifacts.md` (+11 -0) 📝 `README.md` (+1 -0) 📝 `docs/.vitepress/config.ts` (+1 -0) 📝 `docs/cli.md` (+11 -0) 📝 `docs/readme/README_ar.md` (+1 -0) 📝 `docs/readme/README_de.md` (+1 -0) 📝 `docs/readme/README_el.md` (+1 -0) 📝 `docs/readme/README_es.md` (+1 -0) 📝 `docs/readme/README_fa.md` (+1 -0) 📝 `docs/readme/README_fr.md` (+1 -0) 📝 `docs/readme/README_id.md` (+1 -0) 📝 `docs/readme/README_it.md` (+1 -0) 📝 `docs/readme/README_ja.md` (+1 -0) 📝 `docs/readme/README_ko.md` (+1 -0) 📝 `docs/readme/README_ml.md` (+1 -0) 📝 `docs/readme/README_pl.md` (+1 -0) 📝 `docs/readme/README_pt-BR.md` (+1 -0) 📝 `docs/readme/README_ro.md` (+1 -0) 📝 `docs/readme/README_ru.md` (+1 -0) _...and 51 more files_ </details> ### 📄 Description Thank you for the IL2CPP and artifact readers this builds on; it follows the same reader, Evidence and view shape. ## Summary Unity games that use Addressables ship a content catalog (`catalog.json`, or `catalog.bin` from Addressables 2.x on). It maps every load key to a bundle or asset location, with its provider, its dependencies and the bundle's recorded hash and CRC. rea has no reader for it. This adds `inspect_unity_addressables` (CLI `inspect-unity-addressables`), a static, read-only inventory of one local catalog, with retained Evidence pages through `inspect_analysis_view` kind `unity-addressables`. Related: #3607 (Unity umbrella); it does not close it. ## Problem and expected behavior Use case: an agent looking at a Unity build wants to know which bundle holds `Prefabs/Crate`, which bundles it depends on, where those bundles are expected (`{UnityEngine.AddressableAssets.Addressables.RuntimePath}/...` or a remote URL) and their recorded hash and CRC, without Unity. Expected: keys with their encoding and selected locations; locations with primary key, internal id, provider id, resource type, dependencies as location indices and bundle options; provider records; locator id and build result hash. Optional `hash_path` records a `catalog.hash` file's text. ## Change and scope - `src/unity/UnityAddressablesJsonCatalog.ts`: JsonUtility catalogs (base64 key, bucket, entry and extra data; prefix-compressed internal ids expanded). - `src/unity/UnityAddressablesBinaryCatalog.ts`: BinaryStorageBuffer catalogs with header version 2 (Addressables 2.x) and 3 (4.x, checked with 4.1.1). Locations are numbered in first-reference order (key sets, then dependency sets), the key table is admitted before any location set is decoded, and every dependency set is followed before the final row counts are admitted. Version 1, behind the optional `ENABLE_BINARY_CATALOG` define in 1.21/1.22, is refused as unsupported because no built sample was checked. - The decoder is chosen from content, not the file name. Shared offset arrays are decoded once; text is checked before expansion and each row is charged before retention; loops yield every 256 rows. - Failures come from one reason table: `unsupported` (unrecognized format, unsupported version), `malformed` (JSON, base64, record bounds, indices, object tags, strings, string-chain cycles and overlapping chain nodes) and `capacity` (the input and report allowances, named on the refusal). - Input paths use the shared `absoluteLocalPathStringSchema`, and the MCP tool is registered with `applicationToolRegistrationOptions` like IL2CPP, so the service builds field-level input errors. - `src/domain/analysisView/indexedRowPage.ts`: the IL2CPP metadata view and the new view share one indexed row pager instead of two copies. Not included: opening or downloading bundles, resolving runtime placeholders, recomputing `catalog.hash` or bundle CRCs, writing or patching catalogs, decoding location data other than asset bundle request options (its type name is reported), or a reverse index from a bundle to the keys and locations that depend on it (callers page `locations` and invert `dependencies`). Follow the [contribution scope](https://github.com/morluto/rea/blob/main/CONTRIBUTING.md#contribution-scope). Scope decision: pending. This is a new tool that reads one caller-selected local file (plus an optional hash file). ## Contract and boundary impact - Semantic owner and earliest changed stage: format decoders in `src/unity/`; facts and validation in `src/domain/unity/unityAddressables.ts`; delivery in `UnityAddressablesService`. The IL2CPP view now uses the shared `indexedRowPage.ts`; its own pager copy was removed. - Contribution scope fit and linked maintainer decision: pending (see above). - CLI and MCP/tool-catalog contract: new tool `inspect_unity_addressables` (`path`, `detail`, optional `hash_path`), new CLI command with `--hash`, new view kind `unity-addressables` (collections `keys`, `locations`, `providers`). - Provider, bridge, target-format, or platform compatibility: built-in, no external tool, all platforms. - Evidence, artifact, provenance, or reconstruction contract: JSON Evidence is `derived` (dependencies resolved through the dependency key, as the runtime locator does); binary Evidence is `observed`. Failures keep a source observation with artifact identity and declared row counts; once the decoded catalog fits the report budget, later failures keep it as catalog Evidence with any completed `catalog.hash` facts. - Target selection, authority, upstream behavior, and cleanup details (if applicable): one caller-selected regular file (plus an optional hash file of at most 4 KiB), stable snapshot, one inspection per reader, close releases file handles. - Generated metadata (`docs/public/product-catalog.json`), package, or installation impact: none committed; `npm run docs:check` passes. Expected effects (check known effects; use documentation-only on its own). Unchecked items do not establish absence; leave uncertainties visible. - [x] Read existing files or captured data. - [ ] Launch or attach to a process. - [ ] Inject instrumentation or run scripts/code. - [ ] Change process memory, registers, files, or configuration. - [ ] Contact network services. - [ ] Recover protected code or work around protections. - [ ] Documentation or usability only; no target interaction. - [ ] Not sure yet; investigation or maintainer guidance needed. ## Evidence and regression coverage - Tests added or updated: decoder boundaries (every JSON key encoding, binary v2/v3 equal to the JSON facts, shared location sets, dependency-only locations, refusals per reason), provider (identity, hash file, typed failures with source Evidence, report budget, later failures that keep the decoded catalog and a completed hash file, one active inspection, cancellation), view (summary counts, intersecting filters, sealed reuse, validator cross-checks), service, a failed or cancelled hash file close in the shared stable-read tests, one CLI/MCP acceptance test, one MCP boundary test for field-level input errors, and the shared relative-path schema test. All fixtures are authored bytes that follow the Addressables package sources. - Base reproduction or other evidence: contributor-reported verification against catalogs built in batch mode from a small authored project. For each catalog, rea's keys, locations, dependencies and bundle hash/CRC/name/size were compared with what the package's own catalog loader returned in the same editor: | Catalog | Unity / Addressables | SHA-256 (prefix) | Result | |---|---|---|---| | `catalog.json` (local) | 2022.3.62f3 / 1.22.3 | `43f72223` | key pairs 25/25, locations 10/10 | | `catalog_sample.json` (remote copy, with `.hash`) | 2022.3.62f3 / 1.22.3 | `43f72223` | 25/25, 10/10 | | `catalog.bin` header v2 (with `.hash`) | 6000.4.1f1 / 2.10.3 | `97318198` | 18/18, 10/10 | | `catalog.bin` header v3 (with `.hash`) | 6000.4.1f1 / 4.1.1 | `3f4a2821` | 18/18, 10/10 | The remote `catalog_sample.json` is a byte-identical copy of the local catalog in this build, so it adds the `.hash` path, not a second catalog. The comparison script reports a difference for each of four edits to the loader output (one CRC digit, one dependency removed, one key renamed, one JSON dependency hash changed). - User-visible CLI/MCP output (if applicable): `rea inspect-unity-addressables catalog.bin --hash catalog.hash --format json` on the v3 catalog, abridged to the catalog fields, one key and two locations (shown one per line; the output is one JSON document): ```json {"format":"binary","format_version":3,"locator_id":"AddressablesMainContentCatalog","build_result_hash":"83f8806ba058ec59b05bb58865fa6ee7","dependency_basis":"location-records"} {"kind":"string","value":"Prefabs/Crate","type_name":null,"locations":[1]} {"primary_key":"Prefabs/Crate","internal_id":"Assets/Samples/Crate.prefab","provider_id":"UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider","resource_type":"UnityEngine.GameObject","dependencies":[7,6,5],"dependency_key":null,"dependency_hash":0,"data":null,"offset":1918} {"primary_key":"gameplay_assets_prefabs_crate_ef357d631f13122442699a42caad2843.bundle","internal_id":"{UnityEngine.AddressableAssets.Addressables.RuntimePath}/StandaloneOSX/gameplay_assets_prefabs_crate_ef357d631f13122442699a42caad2843.bundle","provider_id":"UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider","resource_type":"UnityEngine.ResourceManagement.ResourceProviders.IAssetBundleResource","dependencies":[],"dependency_key":null,"dependency_hash":0,"data":{"kind":"asset-bundle","hash":"ef357d631f13122442699a42caad2843","crc":104324149,"bundle_name":"0222775c35e348650dfbc5a64e44ac8d","bundle_size":3346},"offset":1795} ``` `bundle_name` is the AssetBundle's internal name, which can differ from the file name; `hash` matches the file name suffix. In binary catalogs `dependency_hash` is the stored value; the runtime computes its own. - Remaining proof gaps: binary version 1; Addressables releases other than the three checked; large production catalogs (not measured); `catalog.hash` is reported, not verified (it did not match an MD5 of the catalog, and I did not reproduce the package's hash). For evidence-bearing changes: - [x] Observed, derived, and inferred claims remain distinguishable. - [x] Artifact identity, source provenance, and failed attempts remain preserved. - [x] Unsupported, incomplete, unavailable, or uncertain outcomes remain visible. ## Validation performed Head `d96f2eb4c` (main merged at `317bf3fe2`), Windows 11, Node 24.19.0, below the `engines` floor 24.22.1 (dependencies installed with `--engine-strict=false`): - `npm run check:fast` (typecheck and lint, 0 errors) and `oxfmt --check` on the changed files: passed. - `vitest run` on five Unity Addressables test files and `tests/process-global/stableArtifactConsumers.test.ts`: 241 passed. The four new tests fail on the previous head. - Not run locally: `tests/acceptance/unityAddressablesCli.test.ts` needs a build, and the build needs the Windows native controls, which this checkout does not have. CI covers it. Earlier, head `1594b9c24`, merged with main `1173c0a9d`: - `npm run typecheck`, `npm run lint` (0 errors), `npm run format:check`, `npm run metadata:check`, `npm run docs:check`: passed. - Changed test files (`vitest run` on the 7 files in this diff): 79 passed. `jscpd`: 3.63%, the same as main (threshold 4%). - Rebuilt CLI against the four catalogs in the table above: key pairs 25/25, 25/25, 18/18, 18/18 and locations 10/10 each, no differences. Not repeated for `d96f2eb4c`, which changes failure handling and report assembly, not decoding. - Full `vitest run` locally: stopped before completion. My Node 26.5.0 is below the new `engines` floor (26.12.1), and the failures seen before stopping were outside Unity (SQLite, AppleScript, Node SEA, plist). I am relying on CI for the full suite. ## Compatibility, safety, and release - Breaking changes or migration steps: none; new tool, CLI command and view kind only. - Real Hopper/Ghidra, browser, or OS coverage: not applicable (built-in reader). Real catalogs were built and compared on macOS only. - Package or release metadata impact: none committed; generated catalogs are produced by CI. - Security, privacy, process, or containment review: reads one caller-selected file and an optional hash file; no execution, network or writes. Catalog text is bounded before expansion and the report is bounded before retention. ## Author readiness Human owner: @8rulerstar - [x] I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work. - [x] I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps. - [x] I declare this PR ready for initial maintainer review. ## Before merge - [x] This PR addresses a concrete problem or an agreed enhancement. - [ ] Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff. - [x] The PR has one focused outcome and the title follows `type(scope): outcome`. - [x] Related issue is linked, or the reason for not linking one is stated above. - [x] Tests cover changed observable behavior and meaningful failure paths. - [x] Owning docs, contracts, and generated metadata are updated where needed. - [x] User-visible CLI/MCP changes include representative output. - [x] I checked the final diff for secrets, unrelated cleanup, and unsupported claims. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
morluto/rea#7705
No description provided.