[PR #3662] fix(flutter): inspect the renamed Dart AOT snapshot layout #5870

Open
opened 2026-10-31 01:10:04 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/3662
Author: @Rinkia
Created: 10/14/2026
Status: 🔄 Open

Base: main ← Head: fix/dart-aot-renamed-snapshot-symbols


📝 Commits (5)

  • 335ca45 fix(flutter): inspect the renamed Dart AOT snapshot layout
  • 02d379b test(flutter): cover renamed-layout partial snapshots
  • 005b3cb Merge remote-tracking branch 'upstream/main' into fix/dart-aot-renamed-snapshot-symbols
  • 31d8994 Merge remote-tracking branch 'upstream/main' into fix/dart-aot-renamed-snapshot-symbols
  • e50d3f7 Merge upstream/main into fix/dart-aot-renamed-snapshot-symbols

📊 Changes

6 files changed (+246 additions, -90 deletions)

View changed files

📝 docs/flutter-analysis.md (+17 -13)
📝 src/contracts/flutter/flutterToolContracts.ts (+1 -1)
📝 src/flutter/DartElf.ts (+9 -4)
📝 src/flutter/FlutterBuild.fixture.ts (+58 -2)
📝 src/flutter/FlutterBuildProvider.ts (+53 -44)
📝 tests/boundary/filesystem/flutterBuildProvider.test.ts (+108 -26)

📄 Description

Summary

inspect_dart_aot refused every libapp.so built after Dart SDK d36adbacaf ("[vm] Remove the VM isolate"), such as current Flutter 3.47 apps, as unsupported_target. It now recognises the renamed single-snapshot layout and decodes its header with the correct FullAOT kind. Fixes #3629.

Problem and expected behavior

That Dart commit:

  • exports _kDartSnapshotData / _kDartSnapshotText (plus _kDartSnapshotBuildId) instead of the four _kDartVm* / _kDartIsolate* symbols. The old-name aliases it mentions don't appear in the AOT ELF's .dynsym;
  • removed kFullCore from Snapshot::Kind, so FullAOT is 2 in that layout (it is 3 in the supported Dart 2.14 layout).

Before (Saber 1.36.1, F-Droid, Flutter 3.47):

unsupported_target: No recognizable Dart snapshot symbols were found: symbol _kDartVmSnapshotData is not in the dynamic symbol table; … _kDartIsolateSnapshotInstructions …

Since rea-agents@6.8.0, main refuses this layout on purpose, with a clearer message (Observed unified Dart snapshot exports; this reader supports the legacy split VM/isolate profile (Dart 2.14 FullAOT kind 3). The unified profile is unsupported, not missing legacy data). This PR replaces that interim refusal with support.

After (same APK):

libapp.coverage: complete    snapshot_hash: 0451907c2eaa8467e848c0067bfe8ed4 (1 source; matches identify_flutter_build)
sections: _kDartSnapshotText (no magic), _kDartSnapshotData (magic valid, kind 2, length 6098754)
string_pool: package URIs ≥1000, dart URIs ≥235, tokens ≥4000 (partial only because the existing 500/2,000 projection caps are exceeded)

Change and scope

  • src/flutter/FlutterBuildProvider.ts: a SNAPSHOT_LAYOUTS table owns each layout's symbols, string-pool symbol, FullAOT kind and limitation wording. Lookup tries the renamed layout first, then the legacy one. Completeness counts derive from the selected layout (this replaces SYMBOL_PAIR_COUNT), and the "no symbols" error lists the names of both layouts.
  • src/flutter/DartElf.ts: readSnapshotHeader takes the layout's FullAOT kind (default 3, the previous behavior).
  • src/flutter/FlutterBuild.fixture.ts: snapshotSection(hash, kind = 3) and a renamedAotFixtureImage mirroring the real layout (data kind 2 with a pool, text, build-id).
  • tests/boundary/filesystem/flutterBuildProvider.test.ts: provider test for the renamed layout.
  • docs/flutter-analysis.md and the inspect_dart_aot tool description: describe both layouts.

Merged with main @ 7d36d172a on 2026-10-26 (merge e50d3f74a). main had meanwhile added an interim refusal for the unified exports (inspect_dart_aot returned unsupported_target with supported_profile: "dart-2.14-split-full-aot"), plus a test and docs saying so. Because this branch reads that layout, the merge:

  • drops the refusal block in FlutterBuildProvider.ts, keeping this branch's "no recognizable Dart snapshot symbols" message, which lists both layouts' lookups;
  • keeps the identify_flutter_build half of main's new test qualifies unified snapshot exports… (single byte-scanned hash, snapshot_hash_sources: 1, partial without "truncated"; renamed to keeps unified payload identification partial without claiming truncation) and drops its inspect_dart_aot rejection half, which the renamed-layout tests replace;
  • removes the docs paragraph calling the unified profile unsupported, and reworded the identification note to point to inspect_dart_aot;
  • keeps main's other changes to these files unchanged (allowance remediation, workspace-failure mapping, cancellation causes, the legacy-profile wording in identify_flutter_build).

Legacy behavior is unchanged: the same symbols, kind 3, and byte-identical limitation texts (the existing 135 Flutter/DartElf tests pass unmodified).

Not included: _kDartSnapshotBuildId isn't reported (it isn't a snapshot section); no new result fields (the layout is visible through sections[].name and the limitations); no change to the string-pool caps.

Follow the contribution scope.
Scope decision: not applicable (bug fix within the existing static, read-only capability).

Contract and boundary impact

  • Semantic owner and earliest changed stage: FlutterBuildProvider symbol-layout selection and readSnapshotHeader's completeness check.
  • Contribution scope fit and linked maintainer decision: not applicable; bug fix for #3629.
  • CLI and MCP/tool-catalog contract: result schema unchanged. The inspect_dart_aot description text is updated to name both layouts.
  • Provider, bridge, target-format, or platform compatibility: adds support for Dart AOT images using the renamed layout; legacy images unaffected.
  • Evidence, artifact, provenance, or reconstruction contract: unchanged shape; for the renamed layout, limitations name _kDartSnapshotData and kind 2.
  • Target selection, authority, upstream behavior, and cleanup details (if applicable): not applicable.
  • Generated metadata (docs/public/product-catalog.json), package, or installation impact: the catalog regenerates from the updated description; 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: inspects an AOT image in the renamed single-snapshot layout (hash, one source, _kDartSnapshotData kind 2 with valid magic, _kDartSnapshotText, package/dart URIs from the data section, coverage: complete, no "of N snapshot symbols" limitation). After review: reports a renamed-layout image without its text symbol as partial and keeps a renamed-layout data header with a non-FullAOT kind as partial (layout-specific symbol count and kind-2 limitations). Mutation-checked: reverting the renamed FullAOT kind to 3, or hard-coding "of 4", each fails a new test.
  • Base reproduction: on the base revision the new test fails with the same unsupported_target message as the real APK.
  • Real target (executed): Saber 1.36.1 x86_64 from F-Droid (https://f-droid.org/repo/com.adilhanney.saber_1360103.apk, sha256 de4813f95bdd6ae54adc5a6142be0762c177a782caaed6ed51dae482f6acb720; libapp.so sha256 b54b19d2…8feb), built with Flutter d3b14c876900e553bc736ca19295fc09e3853e8e (3.47 candidate) per the app's v1.36.1 source. Output above, from node scripts/rea.mjs inspect-dart-aot built from this branch.
  • Header facts on that file, read independently: _kDartSnapshotData at file offset 0x2c0, magic f5f5dcdc, kind 2, hash 0451907c…. The old names occur 0 times in the file, and its 61-byte .dynstr holds exactly the three new names.
  • Re-run after merging main (2026-10-26, branch e50d3f74a, Linux): Saber 1.36.1 x86_64 again reads _kDartSnapshotData kind 2 and _kDartSnapshotText, libapp.coverage: complete, snapshot_hash: 0451907c2eaa8467e848c0067bfe8ed4; string_pool is partial only because of the existing projection caps (1,000+ package URIs against 500 retained). The same APK on rea-agents@6.8.0 returns the interim unsupported_target above.
  • Remaining proof gaps: one real renamed-layout target (x86_64); not checked on arm64/armv7 builds or other post-change Dart releases. The first Dart release containing d36adbacaf isn't pinned down. Kind numbering could change again in later SDKs, and would then report partial coverage rather than fail.

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

Windows 11, Node 24.16.0, branch based on main @ efbc486b9:

  • npx vitest run tests/boundary/filesystem/flutterBuildProvider.test.ts -t "renamed single-snapshot" before the fix: 1 failed (unsupported_target).
  • npx vitest run tests/boundary/filesystem/flutterBuildProvider.test.ts src/flutter/ after the fix: 3 files, 136 passed, 1 skipped (a Unix-socket case not supported on Windows). After the review tests: Flutter provider, src/flutter/, Flutter MCP and acceptance, 5 files, 142 passed, 1 skipped; npm run check:fast exit 0.
  • npx vitest run tests/boundary/mcp/flutterMcp.test.ts tests/boundary/mcp/dartAotSummaryMcp.test.ts tests/acceptance/flutterAnalysis.test.ts src/contracts/ src/domain/analysisView/: 22 files, 236 passed.
  • npm run check:fast (typecheck and lint): exit 0.
  • npm run docs:check: exit 0.
  • npm run build, then node scripts/rea.mjs inspect-dart-aot <saber.apk>: exit 0, output as above.
  • Pre-commit (oxfmt, oxlint) and pre-push (typecheck, lint) hooks: passed.

Re-validation after merging main @ 7d36d172a (2026-10-26, head e50d3f74a), Linux container (rea-agents@6.8.0 image), Node 24.22.1, npm ci --ignore-scripts && npm run compile:

  • npx vitest run tests/boundary/filesystem/flutterBuildProvider.test.ts src/flutter: 3 files, 169 passed.
  • npx tsc --noEmit: exit 0. npm run check:fast (typecheck and lint): exit 0.
  • npx oxfmt --check on the six changed files: clean. npx oxlint on them: 0 errors; the 20 warnings are function- and file-level size and complexity limits (max-lines-per-function, complexity, max-params, max-depth, max-lines) on long existing functions such as inspectDartAot and identifyFlutterBuild; CI treats them as warnings.
  • node scripts/rea.mjs inspect-dart-aot <saber.apk>: exit 0, as above.
  • The merge commit was created with --no-verify and restored to main's content for 26 unrelated files that the local pre-commit linter had auto-fixed (duplicate-import consolidation), so the branch differs from main only in this PR's six files. The local pre-push hook could not run on the Windows host (Node 24.16.0, below the new ^24.22.1 engine range); the same check:fast passed in the container above, and the push used --no-verify.
  • PR CI #18639 failed in test shard 7/8 on cliInputSchemaRequired, claudeDesktopClientConfiguration and workbuddyClientConfiguration (14 tests, none in Flutter code). main's own CI failed the same tests at the same time (#18637 on cd68181c9, #18640 on 3b26d7f80), so this run inherited them. I'll merge main again once its CI is green.

Compatibility, safety, and release

  • Breaking changes or migration steps: none.
  • Real Hopper/Ghidra, browser, or OS coverage: not applicable (pure ELF parsing). Real renamed-layout APK verified on Windows and, after the 2026-10-26 merge, on Linux.
  • Package or release metadata impact: none beyond the regenerated tool description.
  • Security, privacy, process, or containment review: no new I/O, process or network behavior. Symbol lookup still uses the existing bounded readElfSymbols. Legacy images incur one additional dynamic-symbol lookup for the renamed names before falling back; that's a small table scan, unmeasured but negligible next to reading libapp.so.

Author readiness

Human owner: @Rinkia

  • 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.

🤖 Generated with Claude Code


🔄 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/3662 **Author:** [@Rinkia](https://github.com/Rinkia) **Created:** 10/14/2026 **Status:** 🔄 Open **Base:** `main` ← **Head:** `fix/dart-aot-renamed-snapshot-symbols` --- ### 📝 Commits (5) - [`335ca45`](https://github.com/morluto/rea/commit/335ca45f994c2e0755e6670c5a619c58cb27b3cc) fix(flutter): inspect the renamed Dart AOT snapshot layout - [`02d379b`](https://github.com/morluto/rea/commit/02d379b54d70b8ec4dda207fb5b40d2a05889a88) test(flutter): cover renamed-layout partial snapshots - [`005b3cb`](https://github.com/morluto/rea/commit/005b3cbb75cffb62149debff5cb7575e67ee9bc7) Merge remote-tracking branch 'upstream/main' into fix/dart-aot-renamed-snapshot-symbols - [`31d8994`](https://github.com/morluto/rea/commit/31d8994af3ea08a8d64fa96283c2da4a0a205dff) Merge remote-tracking branch 'upstream/main' into fix/dart-aot-renamed-snapshot-symbols - [`e50d3f7`](https://github.com/morluto/rea/commit/e50d3f74ade8b21f43d0d4f6e9a1b31f44a09efe) Merge upstream/main into fix/dart-aot-renamed-snapshot-symbols ### 📊 Changes **6 files changed** (+246 additions, -90 deletions) <details> <summary>View changed files</summary> 📝 `docs/flutter-analysis.md` (+17 -13) 📝 `src/contracts/flutter/flutterToolContracts.ts` (+1 -1) 📝 `src/flutter/DartElf.ts` (+9 -4) 📝 `src/flutter/FlutterBuild.fixture.ts` (+58 -2) 📝 `src/flutter/FlutterBuildProvider.ts` (+53 -44) 📝 `tests/boundary/filesystem/flutterBuildProvider.test.ts` (+108 -26) </details> ### 📄 Description ## Summary `inspect_dart_aot` refused every `libapp.so` built after Dart SDK [`d36adbacaf`](https://github.com/dart-lang/sdk/commit/d36adbacafee01d9852cf8e960cf2d8654d91e7e) ("[vm] Remove the VM isolate"), such as current Flutter 3.47 apps, as `unsupported_target`. It now recognises the renamed single-snapshot layout and decodes its header with the correct FullAOT kind. Fixes #3629. ## Problem and expected behavior That Dart commit: - exports `_kDartSnapshotData` / `_kDartSnapshotText` (plus `_kDartSnapshotBuildId`) instead of the four `_kDartVm*` / `_kDartIsolate*` symbols. The old-name aliases it mentions don't appear in the AOT ELF's `.dynsym`; - removed `kFullCore` from `Snapshot::Kind`, so FullAOT is **2** in that layout (it is 3 in the supported Dart 2.14 layout). Before (Saber 1.36.1, F-Droid, Flutter 3.47): ```text unsupported_target: No recognizable Dart snapshot symbols were found: symbol _kDartVmSnapshotData is not in the dynamic symbol table; … _kDartIsolateSnapshotInstructions … ``` Since `rea-agents@6.8.0`, `main` refuses this layout on purpose, with a clearer message (`Observed unified Dart snapshot exports; this reader supports the legacy split VM/isolate profile (Dart 2.14 FullAOT kind 3). The unified profile is unsupported, not missing legacy data`). This PR replaces that interim refusal with support. After (same APK): ```text libapp.coverage: complete snapshot_hash: 0451907c2eaa8467e848c0067bfe8ed4 (1 source; matches identify_flutter_build) sections: _kDartSnapshotText (no magic), _kDartSnapshotData (magic valid, kind 2, length 6098754) string_pool: package URIs ≥1000, dart URIs ≥235, tokens ≥4000 (partial only because the existing 500/2,000 projection caps are exceeded) ``` ## Change and scope - `src/flutter/FlutterBuildProvider.ts`: a `SNAPSHOT_LAYOUTS` table owns each layout's symbols, string-pool symbol, FullAOT kind and limitation wording. Lookup tries the renamed layout first, then the legacy one. Completeness counts derive from the selected layout (this replaces `SYMBOL_PAIR_COUNT`), and the "no symbols" error lists the names of both layouts. - `src/flutter/DartElf.ts`: `readSnapshotHeader` takes the layout's FullAOT kind (default 3, the previous behavior). - `src/flutter/FlutterBuild.fixture.ts`: `snapshotSection(hash, kind = 3)` and a `renamedAotFixtureImage` mirroring the real layout (data kind 2 with a pool, text, build-id). - `tests/boundary/filesystem/flutterBuildProvider.test.ts`: provider test for the renamed layout. - `docs/flutter-analysis.md` and the `inspect_dart_aot` tool description: describe both layouts. Merged with `main` @ `7d36d172a` on 2026-10-26 (merge `e50d3f74a`). `main` had meanwhile added an interim refusal for the unified exports (`inspect_dart_aot` returned `unsupported_target` with `supported_profile: "dart-2.14-split-full-aot"`), plus a test and docs saying so. Because this branch reads that layout, the merge: - drops the refusal block in `FlutterBuildProvider.ts`, keeping this branch's "no recognizable Dart snapshot symbols" message, which lists both layouts' lookups; - keeps the `identify_flutter_build` half of `main`'s new test `qualifies unified snapshot exports…` (single byte-scanned hash, `snapshot_hash_sources: 1`, partial without "truncated"; renamed to `keeps unified payload identification partial without claiming truncation`) and drops its `inspect_dart_aot` rejection half, which the renamed-layout tests replace; - removes the docs paragraph calling the unified profile unsupported, and reworded the identification note to point to `inspect_dart_aot`; - keeps `main`'s other changes to these files unchanged (allowance remediation, workspace-failure mapping, cancellation causes, the legacy-profile wording in `identify_flutter_build`). Legacy behavior is unchanged: the same symbols, kind 3, and byte-identical limitation texts (the existing 135 Flutter/DartElf tests pass unmodified). Not included: `_kDartSnapshotBuildId` isn't reported (it isn't a snapshot section); no new result fields (the layout is visible through `sections[].name` and the limitations); no change to the string-pool caps. Follow the [contribution scope](https://github.com/morluto/rea/blob/main/CONTRIBUTING.md#contribution-scope). Scope decision: not applicable (bug fix within the existing static, read-only capability). ## Contract and boundary impact - Semantic owner and earliest changed stage: `FlutterBuildProvider` symbol-layout selection and `readSnapshotHeader`'s completeness check. - Contribution scope fit and linked maintainer decision: not applicable; bug fix for #3629. - CLI and MCP/tool-catalog contract: result schema unchanged. The `inspect_dart_aot` description text is updated to name both layouts. - Provider, bridge, target-format, or platform compatibility: adds support for Dart AOT images using the renamed layout; legacy images unaffected. - Evidence, artifact, provenance, or reconstruction contract: unchanged shape; for the renamed layout, limitations name `_kDartSnapshotData` and kind 2. - Target selection, authority, upstream behavior, and cleanup details (if applicable): not applicable. - Generated metadata (`docs/public/product-catalog.json`), package, or installation impact: the catalog regenerates from the updated description; `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: `inspects an AOT image in the renamed single-snapshot layout` (hash, one source, `_kDartSnapshotData` kind 2 with valid magic, `_kDartSnapshotText`, package/dart URIs from the data section, `coverage: complete`, no "of N snapshot symbols" limitation). After review: `reports a renamed-layout image without its text symbol as partial` and `keeps a renamed-layout data header with a non-FullAOT kind as partial` (layout-specific symbol count and kind-2 limitations). Mutation-checked: reverting the renamed FullAOT kind to 3, or hard-coding "of 4", each fails a new test. - Base reproduction: on the base revision the new test fails with the same `unsupported_target` message as the real APK. - Real target (executed): Saber 1.36.1 x86_64 from F-Droid (`https://f-droid.org/repo/com.adilhanney.saber_1360103.apk`, sha256 `de4813f95bdd6ae54adc5a6142be0762c177a782caaed6ed51dae482f6acb720`; `libapp.so` sha256 `b54b19d2…8feb`), built with Flutter `d3b14c876900e553bc736ca19295fc09e3853e8e` (3.47 candidate) per the app's `v1.36.1` source. Output above, from `node scripts/rea.mjs inspect-dart-aot` built from this branch. - Header facts on that file, read independently: `_kDartSnapshotData` at file offset 0x2c0, magic `f5f5dcdc`, kind 2, hash `0451907c…`. The old names occur 0 times in the file, and its 61-byte `.dynstr` holds exactly the three new names. - Re-run after merging `main` (2026-10-26, branch `e50d3f74a`, Linux): Saber 1.36.1 x86_64 again reads `_kDartSnapshotData` kind 2 and `_kDartSnapshotText`, `libapp.coverage: complete`, `snapshot_hash: 0451907c2eaa8467e848c0067bfe8ed4`; `string_pool` is partial only because of the existing projection caps (1,000+ package URIs against 500 retained). The same APK on `rea-agents@6.8.0` returns the interim `unsupported_target` above. - Remaining proof gaps: one real renamed-layout target (x86_64); not checked on arm64/armv7 builds or other post-change Dart releases. The first Dart release containing `d36adbacaf` isn't pinned down. Kind numbering could change again in later SDKs, and would then report partial coverage rather than fail. 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 Windows 11, Node 24.16.0, branch based on `main` @ `efbc486b9`: - `npx vitest run tests/boundary/filesystem/flutterBuildProvider.test.ts -t "renamed single-snapshot"` before the fix: 1 failed (`unsupported_target`). - `npx vitest run tests/boundary/filesystem/flutterBuildProvider.test.ts src/flutter/` after the fix: 3 files, 136 passed, 1 skipped (a Unix-socket case not supported on Windows). After the review tests: Flutter provider, `src/flutter/`, Flutter MCP and acceptance, 5 files, 142 passed, 1 skipped; `npm run check:fast` exit 0. - `npx vitest run tests/boundary/mcp/flutterMcp.test.ts tests/boundary/mcp/dartAotSummaryMcp.test.ts tests/acceptance/flutterAnalysis.test.ts src/contracts/ src/domain/analysisView/`: 22 files, 236 passed. - `npm run check:fast` (typecheck and lint): exit 0. - `npm run docs:check`: exit 0. - `npm run build`, then `node scripts/rea.mjs inspect-dart-aot <saber.apk>`: exit 0, output as above. - Pre-commit (oxfmt, oxlint) and pre-push (typecheck, lint) hooks: passed. Re-validation after merging `main` @ `7d36d172a` (2026-10-26, head `e50d3f74a`), Linux container (`rea-agents@6.8.0` image), Node 24.22.1, `npm ci --ignore-scripts && npm run compile`: - `npx vitest run tests/boundary/filesystem/flutterBuildProvider.test.ts src/flutter`: 3 files, 169 passed. - `npx tsc --noEmit`: exit 0. `npm run check:fast` (typecheck and lint): exit 0. - `npx oxfmt --check` on the six changed files: clean. `npx oxlint` on them: 0 errors; the 20 warnings are function- and file-level size and complexity limits (`max-lines-per-function`, `complexity`, `max-params`, `max-depth`, `max-lines`) on long existing functions such as `inspectDartAot` and `identifyFlutterBuild`; CI treats them as warnings. - `node scripts/rea.mjs inspect-dart-aot <saber.apk>`: exit 0, as above. - The merge commit was created with `--no-verify` and restored to `main`'s content for 26 unrelated files that the local pre-commit linter had auto-fixed (duplicate-import consolidation), so the branch differs from `main` only in this PR's six files. The local pre-push hook could not run on the Windows host (Node 24.16.0, below the new `^24.22.1` engine range); the same `check:fast` passed in the container above, and the push used `--no-verify`. - PR CI #18639 failed in test shard 7/8 on `cliInputSchemaRequired`, `claudeDesktopClientConfiguration` and `workbuddyClientConfiguration` (14 tests, none in Flutter code). `main`'s own CI failed the same tests at the same time (#18637 on `cd68181c9`, #18640 on `3b26d7f80`), so this run inherited them. I'll merge `main` again once its CI is green. ## Compatibility, safety, and release - Breaking changes or migration steps: none. - Real Hopper/Ghidra, browser, or OS coverage: not applicable (pure ELF parsing). Real renamed-layout APK verified on Windows and, after the 2026-10-26 merge, on Linux. - Package or release metadata impact: none beyond the regenerated tool description. - Security, privacy, process, or containment review: no new I/O, process or network behavior. Symbol lookup still uses the existing bounded `readElfSymbols`. Legacy images incur one additional dynamic-symbol lookup for the renamed names before falling back; that's a small table scan, unmeasured but negligible next to reading `libapp.so`. ## Author readiness Human owner: @Rinkia - [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. - [ ] I checked the final diff for secrets, unrelated cleanup, and unsupported claims. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- <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#5870
No description provided.