[PR #4466] [MERGED] feat(android): make the JADX operation deadline configurable #6259

Closed
opened 2026-10-31 01:13:05 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/4466
Author: @SandstromPL
Created: 10/16/2026
Status: ✅ Merged
Merged: 10/16/2026
Merged by: @morluto

Base: main ← Head: feat/jadx-operation-timeout


📝 Commits (2)

  • 4f2c54b feat(android): make the JADX operation deadline configurable
  • 6373f60 test(android): isolate JADX fixtures from inherited shell settings

📊 Changes

12 files changed (+356 additions, -14 deletions)

View changed files

📝 .agents/skills/reverse-engineer-anything/references/android-applications.md (+3 -1)
📝 docs/android-analysis.md (+19 -2)
📝 docs/client-configuration.md (+7 -1)
📝 src/android/JadxConfiguration.ts (+44 -0)
📝 src/android/JadxDoctor.ts (+8 -0)
📝 src/android/JadxProvider.ts (+15 -5)
📝 src/android/JadxRelease.ts (+6 -0)
📝 src/android/JadxSession.ts (+7 -3)
📝 tests/boundary/android/jadxConfiguration.test.ts (+42 -0)
📝 tests/boundary/android/jadxDoctor.test.ts (+49 -0)
📝 tests/boundary/process/jadxIntegration.test.ts (+147 -1)
📝 tests/fixtures/android/jadx.ts (+9 -1)

📄 Description

Summary

Fixes #3918.

JADX operations had two fixed 120-second limits:

  • the provider's whole-operation deadline (OPERATION_TIMEOUT_MS in JadxProvider.ts)
  • a separate per-call bound on every upstream MCP call (timeout: 120_000 in JadxSession.ts)

A large multidex APK whose cold load exceeds 120 s therefore always ended in provider_timeout, and raising only the MCP client's timeout could not extend either limit.

This PR adds an optional setting, REA_JADX_OPERATION_TIMEOUT_MS. It is a decimal millisecond count from 1 to 2147483647, and the default stays 120000. One parsed value bounds both the whole operation and each upstream call. Unset keeps today's behavior.

Problem and expected behavior

  • What the reporter saw: on rea-agents 6.4.0 (macOS arm64, Temurin 21), the operation hit provider_timeout at exactly timeout_ms: 120000 on a large multidex APK. A rea_jvm_status reply was retained, but the load never completed.
  • What wasn't reproduced: no redistributable APK exists, so this was not reproduced, and it is not a confirmed OOM.
  • Expected, per the issue: a caller can select a longer finite deadline, with provider and session deadlines coordinated and the effective value reported. The default, explicit cancellation, bounded output, partial observations and verified owned-process cleanup must be preserved.

Change and scope

  • Parsing (src/android/JadxConfiguration.ts): readOperationTimeout parses the setting once, reusing providerStartupTimeoutSchema. The error text matches REA_KUNA_TIMEOUT_MS.
    • Invalid values get the new failure kind operation_timeout, classified config_drift.
    • The remediation text and DEFAULT_JADX_OPERATION_TIMEOUT_MS live in JadxRelease.ts.
  • Provider (src/android/JadxProvider.ts): #execute resolves the deadline as a Result before acquiring any file handle, workspace or engine.
    • The value feeds AbortSignal.timeout and both AnalysisTimeoutError sites.
    • It is passed to JadxSession.execute. The deadline still starts at the queue front.
    • The fixed constant is removed.
  • Session (src/android/JadxSession.ts): every callTool uses the selected value instead of 120_000.
    • The bound stays explicit; omitting it would fall back to the SDK's 60 s default.
    • Because the provider's timer starts earlier with the same length, it always fires first, so a timeout is still classified as AnalysisTimeoutError.
  • Doctor and setup:
    • inspectJadxAvailability reports operation_timeout_ms, and the passing JADX doctor check exposes it in details.
    • JadxDoctor publishes an explicit value in registrationEnvironment, like REA_JADX_HEAP_MIB, so rea setup forwards it.
  • Docs: docs/android-analysis.md, docs/client-configuration.md, and the skill reference references/android-applications.md.

Contribution scope: a configuration option for an existing read-only static provider, so a maintainer scope decision is not applicable.

Intentionally not included:

  • Counting the deadline in setup's client tool timeout. The derived Codex tool_timeout_sec and Kimi toolTimeoutMs (mcpStartupPolicy.ts, doctorRuntime.ts resolveProviderRequestBudget) don't count this setting. This matches REA_KUNA_TIMEOUT_MS and REA_KUNA_PROJECT_TIMEOUT_MS, which are also forwarded without counting. Including it would mean restructuring a seam that currently runs only for ida/auto, so I've documented the gap in client-configuration.md and android-analysis.md instead. I'm happy to do it as a follow-up.
  • A timeout remediation that names the setting. AnalysisTimeoutError presentation still says "Try a smaller request". Changing that needs a shared error-presentation change, so it's deferred.
  • Changes to the bridge's 30 s startup handshake or the upstream 90 s decompilation limit. Raising the deadline extends neither. At the audited upstream revision the 90 s value wraps only per-class/method decompilation, not load_apk (source-derived).
  • A per-call MCP/CLI argument. There is no tool-schema change.

Contract and boundary impact

  • Semantic owner and earliest changed stage: src/android/JadxConfiguration.ts, at provider configuration before target admission.
  • Contribution scope fit and linked maintainer decision: within the existing JADX provider boundary, with no new authority; not applicable.
  • CLI and MCP/tool-catalog contract:
    • No tool or schema change.
    • provider_timeout details.timeout_ms now reports the selected value.
    • An invalid value returns capability_unavailable (open_options_invalid) before Java starts.
    • The JADX doctor configuration check gains details.operation_timeout_ms (additive).
  • Provider, bridge, target-format, or platform compatibility: the bridge and jadx-headless-mcp 0.7.1 are unchanged. Behavior on real JADX is not verified (see Evidence).
  • Evidence, artifact, provenance, or reconstruction contract: unchanged. Partial observations and cleanup on timeout are asserted by the new tests.
  • Target selection, authority, upstream behavior, and cleanup details:
    • Cancellation precedence is unchanged.
    • The deadline path releases the owned process group and workspace before provider shutdown (asserted).
    • An invalid value fails before any handle, workspace, probe or launch.
  • Generated metadata, package, or installation impact:
    • Only the authored skill reference text changes. generate-skill-metadata.mjs --check passes, and no skill version bump is needed.
    • No catalog change is expected, and skills/ is not committed.
    • The reviewed rea setup plan can now forward an explicitly set REA_JADX_OPERATION_TIMEOUT_MS into client registrations. The ambient environment is never persisted.

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. (existing JADX analysis behavior, unchanged)
  • Launch or attach to a process. (existing JADX engine launch; only its deadline is now selectable)
  • Inject instrumentation or run scripts/code.
  • Change process memory, registers, files, or configuration. (existing reviewed rea setup client registration may now include an explicitly set REA_JADX_OPERATION_TIMEOUT_MS, like REA_JADX_HEAP_MIB)
  • 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:

  • tests/boundary/process/jadxIntegration.test.ts, which uses the real owned-subprocess fake JADX MCP producer:
    • Queued deadline: two queued stalled inspect_android_package requests with REA_JADX_OPERATION_TIMEOUT_MS=1500. Each ends as AnalysisTimeoutError with timeoutMs: 1500 and its own engine launch (2 launches). Each keeps the rea_jvm_status partial observation and projects provider_timeout with details.timeout_ms: 1500. Ownership is released before provider.close().
    • Maximum value: a successful operation under 2147483647, so there is no 1 ms timer clamp.
    • Invalid values: "" and 2147483648 are refused with no Java probe and no launch.
    • Session boundary: each upstream call rejects with SdkErrorCode.RequestTimeout and data.timeout: 300 when timeoutMs: 300. This is a module-level test because the former fixed 120 s call limit is unreachable in a workflow test.
  • tests/boundary/android/jadxConfiguration.test.ts: effective operation_timeout_ms for unset (120000), 1, 900000 and 2147483647. The full invalid matrix ("", 0, -1, 1.5, 1e3, " 5", abc, 2147483648) returns open_options_invalid with failure_kind: operation_timeout.
  • tests/boundary/android/jadxDoctor.test.ts: the default and explicit details.operation_timeout_ms, the registration environment carrying the explicit value, and invalid-value remediation naming the setting.
  • tests/fixtures/android/jadx.ts: optional settings overrides. Since 6373f60d6 (review follow-up), the fixture no longer inherits REA_JADX_* settings from the developer's shell, so an exported deadline or heap value cannot change tests that never selected one.

Base reproduction: on base fe2a398dd with only src/android/ reverted, 8 of the new or changed tests fail. The two deadline tests fail by hitting vitest's 30 s timeout, because the setting was ignored and the fixed 120 s limits applied. The other 67 pass, including the largest-deadline success control, which is expected because the base ignores the setting.

Example output:

  • Timeout projection: {"code":"provider_timeout","details":{"operation":"inspect_android_package","timeout_ms":1500}}
  • Invalid value: REA_JADX_OPERATION_TIMEOUT_MS must be a decimal millisecond count from 1 to 2147483647; received abc.

Remaining proof gaps:

  • No full JDK or real jadx-headless-mcp run, so there is no evidence that a longer deadline lets the reporter's APK finish loading. The real cold-load cost was not measured.
  • Windows and macOS were not run; these integration tests skip on win32.
  • Client-side tool timeouts in Codex, Kimi and Claude were not exercised.

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

Run on Linux with Node 24.18.0 and npm 11.16.0:

  • npm run test:focused -- on the 3 JADX test files plus 13 related Android, doctor, capability and module-boundary test files (16 files listed below): 16 files, 268 tests passed.
    • Files: tests/boundary/process/jadxIntegration.test.ts, tests/boundary/android/jadxConfiguration.test.ts, tests/boundary/android/jadxDoctor.test.ts, src/application/CapabilityInventory.test.ts, src/doctorRuntime.test.ts, tests/acceptance/nonBinaryComposition.test.ts, tests/boundary/android/JadxAnalysis.test.ts, tests/boundary/android/jadxMcpTransport.test.ts, tests/boundary/android/jadxProtocol.test.ts, tests/boundary/mcp/androidLateCompletionMcp.test.ts, tests/boundary/mcp/androidPackageSummaryMcp.test.ts, tests/boundary/process/androidAnalysisMcp.test.ts, tests/boundary/process/androidSearchEvidenceBudget.test.ts, tests/boundary/process/jadxHashCleanup.test.ts, tests/boundary/providers/android/androidLateCompletion.test.ts, tests/evaluation/moduleBoundaries.test.ts.
  • The same 3 JADX files with only src/android/ reverted to base: 8 failed, 67 passed (as described above).
  • npx tsc -p tsconfig.json --noEmit: clean.
  • npm run check: passed. Lint reports 0 errors, and the touched files have the same per-rule warning counts as base.
  • npm run docs:check: passed (includes the skill metadata and doc-facts checks).
  • npm run verify:test-discovery: discovered all 1417 test files exactly once.
  • npx oxfmt --check on the changed files: passed.
  • The checks above ran on 4f2c54ba6. After the test-only follow-up 6373f60d6:
    • With REA_JADX_OPERATION_TIMEOUT_MS=1 REA_JADX_HEAP_MIB=abc REA_JADX_ACTIVE_PROCESSOR_COUNT=0 exported, npm run test:focused -- on the 7 fixture-based Android boundary files passed 63/63. Before the fix, jadxIntegration.test.ts alone had 38 failures under the same exports.
    • In a clean shell, 9 Android test files passed 95/95. npx tsc -p tsconfig.json --noEmit was clean, and npm run check:fast passed.
  • Not run:
    • npm run check:pr
    • npm run verify:package (downloads skills@1.7.2; CI runs it)
    • npm run verify:android (needs a full JDK and downloaded public fixtures)

Compatibility, safety, and release

  • Breaking changes or migration steps: none. Unset keeps the 120000 ms default and identical behavior. The only new failure is an invalid value of the new variable.
  • Real Hopper/Ghidra, browser, or OS coverage: Linux only, with the synthetic JADX producer. No real JDK or JADX.
  • Package or release metadata impact: skill reference text only.
  • Security, privacy, process, or containment review:
    • The value is non-secret and appears in errors and diagnostics, like REA_JADX_HEAP_MIB.
    • A longer deadline lets a stalled engine run longer, but it is still finite, explicitly selected, cancellable, and cleaned up with verified ownership.
    • Performance: one string parse per operation or inspection on the default path; not measured.

Author readiness

Human owner: @SandstromPL

  • 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/4466 **Author:** [@SandstromPL](https://github.com/SandstromPL) **Created:** 10/16/2026 **Status:** ✅ Merged **Merged:** 10/16/2026 **Merged by:** [@morluto](https://github.com/morluto) **Base:** `main` ← **Head:** `feat/jadx-operation-timeout` --- ### 📝 Commits (2) - [`4f2c54b`](https://github.com/morluto/rea/commit/4f2c54ba60cf4cff0ecdcaeb12279ec16031e7da) feat(android): make the JADX operation deadline configurable - [`6373f60`](https://github.com/morluto/rea/commit/6373f60d6e6c7bc96986110b6aaaa82a2df190ef) test(android): isolate JADX fixtures from inherited shell settings ### 📊 Changes **12 files changed** (+356 additions, -14 deletions) <details> <summary>View changed files</summary> 📝 `.agents/skills/reverse-engineer-anything/references/android-applications.md` (+3 -1) 📝 `docs/android-analysis.md` (+19 -2) 📝 `docs/client-configuration.md` (+7 -1) 📝 `src/android/JadxConfiguration.ts` (+44 -0) 📝 `src/android/JadxDoctor.ts` (+8 -0) 📝 `src/android/JadxProvider.ts` (+15 -5) 📝 `src/android/JadxRelease.ts` (+6 -0) 📝 `src/android/JadxSession.ts` (+7 -3) 📝 `tests/boundary/android/jadxConfiguration.test.ts` (+42 -0) 📝 `tests/boundary/android/jadxDoctor.test.ts` (+49 -0) 📝 `tests/boundary/process/jadxIntegration.test.ts` (+147 -1) 📝 `tests/fixtures/android/jadx.ts` (+9 -1) </details> ### 📄 Description ## Summary Fixes #3918. JADX operations had two fixed 120-second limits: - the provider's whole-operation deadline (`OPERATION_TIMEOUT_MS` in `JadxProvider.ts`) - a separate per-call bound on every upstream MCP call (`timeout: 120_000` in `JadxSession.ts`) A large multidex APK whose cold load exceeds 120 s therefore always ended in `provider_timeout`, and raising only the MCP client's timeout could not extend either limit. This PR adds an optional setting, `REA_JADX_OPERATION_TIMEOUT_MS`. It is a decimal millisecond count from 1 to 2147483647, and the default stays 120000. One parsed value bounds both the whole operation and each upstream call. Unset keeps today's behavior. ## Problem and expected behavior - **What the reporter saw:** on rea-agents 6.4.0 (macOS arm64, Temurin 21), the operation hit `provider_timeout` at exactly `timeout_ms: 120000` on a large multidex APK. A `rea_jvm_status` reply was retained, but the load never completed. - **What wasn't reproduced:** no redistributable APK exists, so this was not reproduced, and it is not a confirmed OOM. - **Expected, per the issue:** a caller can select a longer finite deadline, with provider and session deadlines coordinated and the effective value reported. The default, explicit cancellation, bounded output, partial observations and verified owned-process cleanup must be preserved. ## Change and scope - **Parsing** (`src/android/JadxConfiguration.ts`): `readOperationTimeout` parses the setting once, reusing `providerStartupTimeoutSchema`. The error text matches `REA_KUNA_TIMEOUT_MS`. - Invalid values get the new failure kind `operation_timeout`, classified `config_drift`. - The remediation text and `DEFAULT_JADX_OPERATION_TIMEOUT_MS` live in `JadxRelease.ts`. - **Provider** (`src/android/JadxProvider.ts`): `#execute` resolves the deadline as a `Result` before acquiring any file handle, workspace or engine. - The value feeds `AbortSignal.timeout` and both `AnalysisTimeoutError` sites. - It is passed to `JadxSession.execute`. The deadline still starts at the queue front. - The fixed constant is removed. - **Session** (`src/android/JadxSession.ts`): every `callTool` uses the selected value instead of `120_000`. - The bound stays explicit; omitting it would fall back to the SDK's 60 s default. - Because the provider's timer starts earlier with the same length, it always fires first, so a timeout is still classified as `AnalysisTimeoutError`. - **Doctor and setup:** - `inspectJadxAvailability` reports `operation_timeout_ms`, and the passing JADX doctor check exposes it in `details`. - `JadxDoctor` publishes an explicit value in `registrationEnvironment`, like `REA_JADX_HEAP_MIB`, so `rea setup` forwards it. - **Docs:** `docs/android-analysis.md`, `docs/client-configuration.md`, and the skill reference `references/android-applications.md`. Contribution scope: a configuration option for an existing read-only static provider, so a maintainer scope decision is not applicable. **Intentionally not included:** - **Counting the deadline in setup's client tool timeout.** The derived Codex `tool_timeout_sec` and Kimi `toolTimeoutMs` (`mcpStartupPolicy.ts`, `doctorRuntime.ts` `resolveProviderRequestBudget`) don't count this setting. This matches `REA_KUNA_TIMEOUT_MS` and `REA_KUNA_PROJECT_TIMEOUT_MS`, which are also forwarded without counting. Including it would mean restructuring a seam that currently runs only for `ida`/`auto`, so I've documented the gap in `client-configuration.md` and `android-analysis.md` instead. I'm happy to do it as a follow-up. - **A timeout remediation that names the setting.** `AnalysisTimeoutError` presentation still says "Try a smaller request". Changing that needs a shared error-presentation change, so it's deferred. - **Changes to the bridge's 30 s startup handshake or the upstream 90 s decompilation limit.** Raising the deadline extends neither. At the audited upstream revision the 90 s value wraps only per-class/method decompilation, not `load_apk` (source-derived). - **A per-call MCP/CLI argument.** There is no tool-schema change. ## Contract and boundary impact - **Semantic owner and earliest changed stage:** `src/android/JadxConfiguration.ts`, at provider configuration before target admission. - **Contribution scope fit and linked maintainer decision:** within the existing JADX provider boundary, with no new authority; not applicable. - **CLI and MCP/tool-catalog contract:** - No tool or schema change. - `provider_timeout` `details.timeout_ms` now reports the selected value. - An invalid value returns `capability_unavailable` (`open_options_invalid`) before Java starts. - The JADX doctor configuration check gains `details.operation_timeout_ms` (additive). - **Provider, bridge, target-format, or platform compatibility:** the bridge and jadx-headless-mcp 0.7.1 are unchanged. Behavior on real JADX is not verified (see Evidence). - **Evidence, artifact, provenance, or reconstruction contract:** unchanged. Partial observations and cleanup on timeout are asserted by the new tests. - **Target selection, authority, upstream behavior, and cleanup details:** - Cancellation precedence is unchanged. - The deadline path releases the owned process group and workspace before provider shutdown (asserted). - An invalid value fails before any handle, workspace, probe or launch. - **Generated metadata, package, or installation impact:** - Only the authored skill reference text changes. `generate-skill-metadata.mjs --check` passes, and no skill version bump is needed. - No catalog change is expected, and `skills/` is not committed. - The reviewed `rea setup` plan can now forward an explicitly set `REA_JADX_OPERATION_TIMEOUT_MS` into client registrations. The ambient environment is never persisted. 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. (existing JADX analysis behavior, unchanged) - [x] Launch or attach to a process. (existing JADX engine launch; only its deadline is now selectable) - [ ] Inject instrumentation or run scripts/code. - [x] Change process memory, registers, files, or configuration. (existing reviewed `rea setup` client registration may now include an explicitly set `REA_JADX_OPERATION_TIMEOUT_MS`, like `REA_JADX_HEAP_MIB`) - [ ] 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:** - `tests/boundary/process/jadxIntegration.test.ts`, which uses the real owned-subprocess fake JADX MCP producer: - **Queued deadline:** two queued stalled `inspect_android_package` requests with `REA_JADX_OPERATION_TIMEOUT_MS=1500`. Each ends as `AnalysisTimeoutError` with `timeoutMs: 1500` and its own engine launch (2 launches). Each keeps the `rea_jvm_status` partial observation and projects `provider_timeout` with `details.timeout_ms: 1500`. Ownership is released before `provider.close()`. - **Maximum value:** a successful operation under `2147483647`, so there is no 1 ms timer clamp. - **Invalid values:** `""` and `2147483648` are refused with no Java probe and no launch. - **Session boundary:** each upstream call rejects with `SdkErrorCode.RequestTimeout` and `data.timeout: 300` when `timeoutMs: 300`. This is a module-level test because the former fixed 120 s call limit is unreachable in a workflow test. - `tests/boundary/android/jadxConfiguration.test.ts`: effective `operation_timeout_ms` for unset (120000), `1`, `900000` and `2147483647`. The full invalid matrix (`""`, `0`, `-1`, `1.5`, `1e3`, `" 5"`, `abc`, `2147483648`) returns `open_options_invalid` with `failure_kind: operation_timeout`. - `tests/boundary/android/jadxDoctor.test.ts`: the default and explicit `details.operation_timeout_ms`, the registration environment carrying the explicit value, and invalid-value remediation naming the setting. - `tests/fixtures/android/jadx.ts`: optional settings overrides. Since 6373f60d6 (review follow-up), the fixture no longer inherits `REA_JADX_*` settings from the developer's shell, so an exported deadline or heap value cannot change tests that never selected one. **Base reproduction:** on base `fe2a398dd` with only `src/android/` reverted, 8 of the new or changed tests fail. The two deadline tests fail by hitting vitest's 30 s timeout, because the setting was ignored and the fixed 120 s limits applied. The other 67 pass, including the largest-deadline success control, which is expected because the base ignores the setting. **Example output:** - Timeout projection: `{"code":"provider_timeout","details":{"operation":"inspect_android_package","timeout_ms":1500}}` - Invalid value: `REA_JADX_OPERATION_TIMEOUT_MS must be a decimal millisecond count from 1 to 2147483647; received abc.` **Remaining proof gaps:** - No full JDK or real jadx-headless-mcp run, so there is no evidence that a longer deadline lets the reporter's APK finish loading. The real cold-load cost was not measured. - Windows and macOS were not run; these integration tests skip on win32. - Client-side tool timeouts in Codex, Kimi and Claude were not exercised. 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 Run on Linux with Node 24.18.0 and npm 11.16.0: - `npm run test:focused --` on the 3 JADX test files plus 13 related Android, doctor, capability and module-boundary test files (16 files listed below): 16 files, 268 tests passed. - Files: `tests/boundary/process/jadxIntegration.test.ts`, `tests/boundary/android/jadxConfiguration.test.ts`, `tests/boundary/android/jadxDoctor.test.ts`, `src/application/CapabilityInventory.test.ts`, `src/doctorRuntime.test.ts`, `tests/acceptance/nonBinaryComposition.test.ts`, `tests/boundary/android/JadxAnalysis.test.ts`, `tests/boundary/android/jadxMcpTransport.test.ts`, `tests/boundary/android/jadxProtocol.test.ts`, `tests/boundary/mcp/androidLateCompletionMcp.test.ts`, `tests/boundary/mcp/androidPackageSummaryMcp.test.ts`, `tests/boundary/process/androidAnalysisMcp.test.ts`, `tests/boundary/process/androidSearchEvidenceBudget.test.ts`, `tests/boundary/process/jadxHashCleanup.test.ts`, `tests/boundary/providers/android/androidLateCompletion.test.ts`, `tests/evaluation/moduleBoundaries.test.ts`. - The same 3 JADX files with only `src/android/` reverted to base: 8 failed, 67 passed (as described above). - `npx tsc -p tsconfig.json --noEmit`: clean. - `npm run check`: passed. Lint reports 0 errors, and the touched files have the same per-rule warning counts as base. - `npm run docs:check`: passed (includes the skill metadata and doc-facts checks). - `npm run verify:test-discovery`: discovered all 1417 test files exactly once. - `npx oxfmt --check` on the changed files: passed. - The checks above ran on 4f2c54ba6. After the test-only follow-up 6373f60d6: - With `REA_JADX_OPERATION_TIMEOUT_MS=1 REA_JADX_HEAP_MIB=abc REA_JADX_ACTIVE_PROCESSOR_COUNT=0` exported, `npm run test:focused --` on the 7 fixture-based Android boundary files passed 63/63. Before the fix, `jadxIntegration.test.ts` alone had 38 failures under the same exports. - In a clean shell, 9 Android test files passed 95/95. `npx tsc -p tsconfig.json --noEmit` was clean, and `npm run check:fast` passed. - **Not run:** - `npm run check:pr` - `npm run verify:package` (downloads `skills@1.7.2`; CI runs it) - `npm run verify:android` (needs a full JDK and downloaded public fixtures) ## Compatibility, safety, and release - **Breaking changes or migration steps:** none. Unset keeps the 120000 ms default and identical behavior. The only new failure is an invalid value of the new variable. - **Real Hopper/Ghidra, browser, or OS coverage:** Linux only, with the synthetic JADX producer. No real JDK or JADX. - **Package or release metadata impact:** skill reference text only. - **Security, privacy, process, or containment review:** - The value is non-secret and appears in errors and diagnostics, like `REA_JADX_HEAP_MIB`. - A longer deadline lets a stalled engine run longer, but it is still finite, explicitly selected, cancellable, and cleaned up with verified ownership. - Performance: one string parse per operation or inspection on the default path; not measured. ## Author readiness <!-- The human owner completes these declarations before requesting review. The PR author is the owner by default. A different owner must explicitly accept ownership on this PR. AI agents must leave these declarations to a human to dictate to them or there could be catastrophic consequences for many users of REA. Draft PRs may leave them unchecked. These declarations record initial readiness when opening the PR for review; later pushes do not require a new human sign-off. Keep the description and validation evidence current as the work changes. See CONTRIBUTING.md#pull-request-ownership-and-readiness. --> Human owner: @SandstromPL - [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. - [x] 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. 🤖 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>
bsakaguchi 2026-10-31 01:13:05 +00:00
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#6259
No description provided.