[PR #7365] [MERGED] fix(artifacts): classify bundle executables by their own name #7833

Closed
opened 2026-11-05 01:48:00 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/7365
Author: @chordpli
Created: 10/27/2026
Status: ✅ Merged
Merged: 11/4/2026
Merged by: @morluto

Base: main ← Head: fix/bundle-executable-classification


📝 Commits (9)

  • 7cf864e fix(artifacts): classify bundle executables by their own name
  • 3b4af1c fix(artifacts): share the artifact identity across every artifact route
  • b83bc28 fix(artifacts): name the classification spelling at the resolver boundary
  • 148477c Merge remote-tracking branch 'origin/main' into fix/bundle-executable-classification
  • dbbd607 fix(artifacts): route bundle keyed archive reads by bundle facts
  • 9770575 Merge remote-tracking branch 'origin/main' into fix/bundle-executable-classification
  • cdadc10 Merge remote-tracking branch 'origin/main' into fix/bundle-executable-classification
  • 19ff5e2 Merge remote-tracking branch 'origin/main' into fix/bundle-executable-classification
  • 55bd343 refactor(artifacts): build the selected ESP flash identity from the shared owner

📊 Changes

5 files changed (+146 additions, -39 deletions)

View changed files

📝 src/application/BinaryTargetResolver.ts (+34 -35)
📝 src/artifacts/ArtifactProvider.ts (+5 -1)
📝 src/domain/apple/artifactTargetApplicability.ts (+3 -2)
📝 tests/boundary/filesystem/artifactSelectedName.test.ts (+56 -1)
📝 tests/boundary/filesystem/keyedArchiveSelection.test.ts (+48 -0)

📄 Description

Summary

Fixes #7362.

Since c27560e43, opening a directory bundle whose CFBundleExecutable is a name-classified artifact (JavaScript, plist, source map, ASAR) is refused with target_unavailable / unsupported_target ("Cannot open artifact: unsupported binary format."). The resolver resolves Fixture.app/ to its executable main.js but still classifies that executable by the bundle directory's name, which artifactNameForClassification treats as an App Pack alias. After classification is repaired, 2dd2ffcd4's admitted-source digest check fails next, because artifact-kind targets never carried bundleInfoPlist, so the check compared the directory instead of the executable.

Both failures were visible on main from c27560e43 until 1201c2554 (#7349), which switched the artifactInspectionCoverageMcp fixture to a Mach-O executable. tests/acceptance/applications/artifactComparisonCoverage.test.ts and tests/boundary/mcp/artifactInspectionCoverageMcp.test.ts therefore pass on current main, while the refusal itself is unchanged; the new cases in artifactSelectedName.test.ts reproduce it.

Problem and expected behavior

  • Trigger: rea open Fixture.app (or open_binary / inspect_artifact / compare_artifacts) where Fixture.app/Info.plist names main.js as CFBundleExecutable.
  • Violated invariant: a bundle directory is selected for its executable, so the executable's own name is the classification name; the bundle facts (bundleInfoPlist) belong to the resolved target regardless of its kind.
  • Expected: the target admits as kind: "artifact", format: "javascript" with path = the executable, artifactSelectedPath = the bundle directory and bundleInfoPlist set, as it did at 3515b2622.

Change and scope

  • src/application/BinaryTargetResolver.ts
    • resolve() already knows whether the caller selected a file or a bundle directory, so it hands readOpenedBinaryTarget the spelling to classify by (classifiedAs): the caller's spelling for a file, the executable's own name for a bundle. The reader no longer infers this from bundleInfoPlist, and the bundle directory never reaches artifactNameForClassification's .app alias rule.
    • One identity() (canonical path, source path, bundle facts, digest) feeds every admitted route; the artifact routes layer artifactSelectedPath on it. main's ESP flash routes (#8228), the detected and the explicitly selected one, use the same identity after the merge in 19ff5e246 and 55bd343f8. ArtifactProvider's expectedRootSha256 (bundleInfoPlist === undefined ? sha256 : undefined) therefore applies to files, not to bundle executables, on every route.
  • src/domain/apple/artifactTargetApplicability.ts: inspect_asset_catalog, decode_interface_builder and inspect_keyed_archive accept any target that carries bundleInfoPlist. They read the bundle directory, so a bundle whose executable admitted as an artifact is an .app target too; before, it was refused with "requires an active .app bundle target" although the bundle facts were present.
  • src/artifacts/ArtifactProvider.ts: inspect_keyed_archive takes the standalone route only when the target carries no bundleInfoPlist. A bundle whose executable is itself a plist is read as a bundle (bundle-relative path, executable digest verified through withArtifactTargetIdentity), matching inspect_asset_catalog, which already routes by the bundle facts.
  • tests/boundary/filesystem/artifactSelectedName.test.ts: a directory bundle with CFBundleExecutable=main.js admits as artifact/javascript, and one whose executable is a script stub with an appended ZIP admits as archive/zip; both keep bundleInfoPlist and artifactSelectedPath.
  • Not included: HarmonyOS .app App Pack files keep their selected-spelling classification (they are files, not resolved bundles). Mach-O bundle executables were never affected because they skip name classification. For bundle targets expectedRootSha256 stays undefined, as main already does for executable bundles; binding bundle inventory to the admitted executable (for example re-checking bundleInfoPlist and the selected directory at inventory time) would be a separate change to 2dd2ffcd4's rule, not restored here.

Follow the contribution scope.
Unresolved scope, authority, side effects, or required verification block
integration. Link the required maintainer scope decision for new providers or
capabilities involving target execution, injection, mutation, or protection
recovery; ordinary fixes within existing boundaries may state "not applicable".
Draft PRs may leave the scope decision pending and the readiness and merge checklists
unchecked. Maintainers can help resolve open questions.

Contract and boundary impact

  • Semantic owner and earliest changed stage: resolve() / readOpenedBinaryTarget in src/application/BinaryTargetResolver.ts (target admission). Consumers: ArtifactProvider (expectedRootSha256), BinarySessionExecution.isArtifactBundleSubject and artifactTargetRefusal, which read bundleInfoPlist.
  • Contribution scope fit and linked maintainer decision: not applicable; ordinary fix within existing boundaries.
  • CLI and MCP/tool-catalog contract: no schema change. Bundle targets whose executable is an artifact admit again; BinaryTarget.bundleInfoPlist is now populated for artifact, archive and database kinds as it already was for executables, and the three .app bundle operations accept such targets.
  • Provider, bridge, target-format, or platform compatibility: macOS/Linux directory bundles. Windows not run.
  • Evidence, artifact, provenance, or reconstruction contract: artifactSelectedPath still records the caller's bundle spelling; no Evidence shape change.
  • Target selection, authority, upstream behavior, and cleanup details (if applicable): not applicable.
  • Generated metadata (docs/public/product-catalog.json), package, or installation impact (CI generates and validates ignored catalogs and skills/; edit authored instructions in .agents/skills/reverse-engineer-anything/ and never commit build outputs): none.

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:
    • tests/boundary/filesystem/artifactSelectedName.test.ts: new cases for a directory bundle with a JavaScript executable (fails on main with unsupported binary format) and for a script-stub executable with a trailing archive (the fallback route Greptile flagged).
    • tests/boundary/filesystem/keyedArchiveSelection.test.ts: a bundle whose CFBundleExecutable is a plist is opened through the session and inspect_keyed_archive reads a bundle-relative archive (fails without the provider routing change with "Invalid analysis input", because the standalone route compared the bundle directory with the executable).
    • tests/acceptance/applications/artifactComparisonCoverage.test.ts and tests/boundary/mcp/artifactInspectionCoverageMcp.test.ts exercise the same resolver through MCP and the acceptance workflow; since 1201c2554 their fixture is a Mach-O executable, so they pass on main and here and no longer cover this bug.
  • Base reproduction or other evidence: git bisect between a7f50e338 (last green main CI) and ace4dbf36 on artifactInspectionCoverageMcp.test.ts: first bad c27560e43; parent 3515b2622 passes. The second blocker was isolated by applying only the classification change and observing integrity_mismatch "The opened file was replaced by a directory" from assertAdmittedRootDigest. At main a95b83c2b (after #7349) the two new artifactSelectedName cases still fail on unmodified main: 2 failed, unsupported binary format for the JavaScript executable and missing bundleInfoPlist for the script-stub bundle.
  • User-visible CLI/MCP output (if applicable): the two existing tests exercise inspect_artifact and compare_artifacts through the MCP and acceptance workflows.
  • Remaining proof gaps: not run on Windows or Linux locally (CI covers Linux). No real third-party .app with a JavaScript executable was tried.

Boundary regressions covered:

  • Raw identity and normalization: the caller-selected bundle spelling (artifactSelectedPath) stays separate from the canonical executable path used for classification and digests (artifactSelectedName.test.ts).
  • Public success and error delivery: inspect_artifact and compare_artifacts through MCP and the acceptance workflow on a directory bundle (existing regressions).

Lifecycle regressions: not applicable; no resource acquisition or cleanup changes.

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

At 55bd343f8 (main 2d5dec26c merged; one conflict in BinaryTargetResolver.ts, where main added a source-path argument to detectArtifactFormat and ESP flash routes that built path, source path and digest inline; they now use the shared identity(); macOS 26.5.2, Node 24.22.1):

  • npm run test:focused -- artifactSelectedName, keyedArchiveSelection, binaryTarget, espFlashImageMcp, BinarySessionBundleResources, TargetFormatVocabularies — 6 files, 188 passed, 2 skipped
  • npm run check:fast — passed
  • npm run format:check — passed
  • Not run at this head: npm run docs:check and the other files of the earlier nine-file set

At cdadc10b6 (main 18a8e71c9 merged; main added UnityFS and U-Boot uImage detection to detectArtifactFormat, no conflict; macOS 26.5.2, Node 24.22.1):

  • npm run test:focused -- the same nine files — 81 passed, 2 skipped
  • npm run check:fast — passed
  • npm run docs:check — passed

At 9770575ce (main 5ae77656e merged; main added Intel HEX / S-record detection to detectArtifactFormat in BinaryTargetResolver.ts, no conflict with the classification change; macOS 26.5.2, Node 24.22.1):

  • npm run test:focused -- the same nine files — 81 passed, 2 skipped
  • npm run check:fast — passed
  • npm run docs:check — passed

At dbbd607d7 (main a95b83c2b merged, macOS 26.5.2, Node 24.22.1):

  • npm run test:focused -- artifactSelectedName, keyedArchiveSelection, keyedArchiveStandaloneSelection, bundleResourceComposition, artifactMcp, keyedArchivePrototypeKeyMcp, dylibResolutionMcp, artifactInspectionCoverageMcp, artifactComparisonCoverage — 9 files, 81 passed, 2 skipped
  • keyedArchiveSelection.test.ts with src/artifacts/ArtifactProvider.ts reverted: the new bundle case fails ("Invalid analysis input for inspect_keyed_archive")
  • At 7cf864eb2 with src/application/BinaryTargetResolver.ts reverted: the three files fail as on main (4 failed: the three existing regressions and the new bundle case)
  • npm run check:fast — passed
  • npm run docs:check — passed
  • Built CLI E2E on main d1c88fab1 vs this branch: see the PR comment.

Compatibility, safety, and release

  • Breaking changes or migration steps: none. Restores the pre-c27560e43 admission of bundle directories; adds bundleInfoPlist to non-executable bundle targets.
  • Real Hopper/Ghidra, browser, or OS coverage: macOS only, local fixtures.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: no new process or network access; the digest check now binds to the executable the caller's bundle resolved to.

Author readiness

Human owner: @chordpli

  • 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/7365 **Author:** [@chordpli](https://github.com/chordpli) **Created:** 10/27/2026 **Status:** ✅ Merged **Merged:** 11/4/2026 **Merged by:** [@morluto](https://github.com/morluto) **Base:** `main` ← **Head:** `fix/bundle-executable-classification` --- ### 📝 Commits (9) - [`7cf864e`](https://github.com/morluto/rea/commit/7cf864eb2c8970cf353906e7e5e9e2b18950eb09) fix(artifacts): classify bundle executables by their own name - [`3b4af1c`](https://github.com/morluto/rea/commit/3b4af1ce5ac63976ccde385f2928e90036fed4ba) fix(artifacts): share the artifact identity across every artifact route - [`b83bc28`](https://github.com/morluto/rea/commit/b83bc288e7d3013133e97ff66f656d98ac2af638) fix(artifacts): name the classification spelling at the resolver boundary - [`148477c`](https://github.com/morluto/rea/commit/148477c2657942a1e293f931dda378e72725ca1d) Merge remote-tracking branch 'origin/main' into fix/bundle-executable-classification - [`dbbd607`](https://github.com/morluto/rea/commit/dbbd607d781836f8bcdda1c4480fe4be28233438) fix(artifacts): route bundle keyed archive reads by bundle facts - [`9770575`](https://github.com/morluto/rea/commit/9770575cefc8deaad2519266c76da1d9f499a45f) Merge remote-tracking branch 'origin/main' into fix/bundle-executable-classification - [`cdadc10`](https://github.com/morluto/rea/commit/cdadc10b6c3dc069b8dd52707e10b7a121ba698d) Merge remote-tracking branch 'origin/main' into fix/bundle-executable-classification - [`19ff5e2`](https://github.com/morluto/rea/commit/19ff5e2464e1ea0f660b8419159168f06daf8948) Merge remote-tracking branch 'origin/main' into fix/bundle-executable-classification - [`55bd343`](https://github.com/morluto/rea/commit/55bd343f865f8d7e5231c320a85065db794acd66) refactor(artifacts): build the selected ESP flash identity from the shared owner ### 📊 Changes **5 files changed** (+146 additions, -39 deletions) <details> <summary>View changed files</summary> 📝 `src/application/BinaryTargetResolver.ts` (+34 -35) 📝 `src/artifacts/ArtifactProvider.ts` (+5 -1) 📝 `src/domain/apple/artifactTargetApplicability.ts` (+3 -2) 📝 `tests/boundary/filesystem/artifactSelectedName.test.ts` (+56 -1) 📝 `tests/boundary/filesystem/keyedArchiveSelection.test.ts` (+48 -0) </details> ### 📄 Description ## Summary Fixes #7362. Since c27560e43, opening a directory bundle whose `CFBundleExecutable` is a name-classified artifact (JavaScript, plist, source map, ASAR) is refused with `target_unavailable` / `unsupported_target` ("Cannot open artifact: unsupported binary format."). The resolver resolves `Fixture.app/` to its executable `main.js` but still classifies that executable by the bundle directory's name, which `artifactNameForClassification` treats as an App Pack alias. After classification is repaired, 2dd2ffcd4's admitted-source digest check fails next, because artifact-kind targets never carried `bundleInfoPlist`, so the check compared the directory instead of the executable. Both failures were visible on `main` from c27560e43 until 1201c2554 (#7349), which switched the `artifactInspectionCoverageMcp` fixture to a Mach-O executable. `tests/acceptance/applications/artifactComparisonCoverage.test.ts` and `tests/boundary/mcp/artifactInspectionCoverageMcp.test.ts` therefore pass on current `main`, while the refusal itself is unchanged; the new cases in `artifactSelectedName.test.ts` reproduce it. ## Problem and expected behavior - Trigger: `rea open Fixture.app` (or `open_binary` / `inspect_artifact` / `compare_artifacts`) where `Fixture.app/Info.plist` names `main.js` as `CFBundleExecutable`. - Violated invariant: a bundle directory is selected for its executable, so the executable's own name is the classification name; the bundle facts (`bundleInfoPlist`) belong to the resolved target regardless of its kind. - Expected: the target admits as `kind: "artifact", format: "javascript"` with `path` = the executable, `artifactSelectedPath` = the bundle directory and `bundleInfoPlist` set, as it did at 3515b2622. ## Change and scope - `src/application/BinaryTargetResolver.ts` - `resolve()` already knows whether the caller selected a file or a bundle directory, so it hands `readOpenedBinaryTarget` the spelling to classify by (`classifiedAs`): the caller's spelling for a file, the executable's own name for a bundle. The reader no longer infers this from `bundleInfoPlist`, and the bundle directory never reaches `artifactNameForClassification`'s `.app` alias rule. - One `identity()` (canonical path, source path, bundle facts, digest) feeds every admitted route; the artifact routes layer `artifactSelectedPath` on it. `main`'s ESP flash routes (#8228), the detected and the explicitly selected one, use the same identity after the merge in `19ff5e246` and `55bd343f8`. `ArtifactProvider`'s `expectedRootSha256` (`bundleInfoPlist === undefined ? sha256 : undefined`) therefore applies to files, not to bundle executables, on every route. - `src/domain/apple/artifactTargetApplicability.ts`: `inspect_asset_catalog`, `decode_interface_builder` and `inspect_keyed_archive` accept any target that carries `bundleInfoPlist`. They read the bundle directory, so a bundle whose executable admitted as an artifact is an `.app` target too; before, it was refused with "requires an active .app bundle target" although the bundle facts were present. - `src/artifacts/ArtifactProvider.ts`: `inspect_keyed_archive` takes the standalone route only when the target carries no `bundleInfoPlist`. A bundle whose executable is itself a plist is read as a bundle (bundle-relative `path`, executable digest verified through `withArtifactTargetIdentity`), matching `inspect_asset_catalog`, which already routes by the bundle facts. - `tests/boundary/filesystem/artifactSelectedName.test.ts`: a directory bundle with `CFBundleExecutable=main.js` admits as `artifact`/`javascript`, and one whose executable is a script stub with an appended ZIP admits as `archive`/`zip`; both keep `bundleInfoPlist` and `artifactSelectedPath`. - Not included: HarmonyOS `.app` App Pack files keep their selected-spelling classification (they are files, not resolved bundles). Mach-O bundle executables were never affected because they skip name classification. For bundle targets `expectedRootSha256` stays undefined, as `main` already does for executable bundles; binding bundle inventory to the admitted executable (for example re-checking `bundleInfoPlist` and the selected directory at inventory time) would be a separate change to 2dd2ffcd4's rule, not restored here. Follow the [contribution scope](https://github.com/morluto/rea/blob/main/CONTRIBUTING.md#contribution-scope). Unresolved scope, authority, side effects, or required verification block integration. Link the required maintainer scope decision for new providers or capabilities involving target execution, injection, mutation, or protection recovery; ordinary fixes within existing boundaries may state "not applicable". Draft PRs may leave the scope decision pending and the readiness and merge checklists unchecked. Maintainers can help resolve open questions. ## Contract and boundary impact - Semantic owner and earliest changed stage: `resolve()` / `readOpenedBinaryTarget` in `src/application/BinaryTargetResolver.ts` (target admission). Consumers: `ArtifactProvider` (`expectedRootSha256`), `BinarySessionExecution.isArtifactBundleSubject` and `artifactTargetRefusal`, which read `bundleInfoPlist`. - Contribution scope fit and linked maintainer decision: not applicable; ordinary fix within existing boundaries. - CLI and MCP/tool-catalog contract: no schema change. Bundle targets whose executable is an artifact admit again; `BinaryTarget.bundleInfoPlist` is now populated for artifact, archive and database kinds as it already was for executables, and the three `.app` bundle operations accept such targets. - Provider, bridge, target-format, or platform compatibility: macOS/Linux directory bundles. Windows not run. - Evidence, artifact, provenance, or reconstruction contract: `artifactSelectedPath` still records the caller's bundle spelling; no Evidence shape change. - Target selection, authority, upstream behavior, and cleanup details (if applicable): not applicable. - Generated metadata (`docs/public/product-catalog.json`), package, or installation impact (CI generates and validates ignored catalogs and `skills/`; edit authored instructions in `.agents/skills/reverse-engineer-anything/` and never commit build outputs): none. 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: - `tests/boundary/filesystem/artifactSelectedName.test.ts`: new cases for a directory bundle with a JavaScript executable (fails on `main` with `unsupported binary format`) and for a script-stub executable with a trailing archive (the fallback route Greptile flagged). - `tests/boundary/filesystem/keyedArchiveSelection.test.ts`: a bundle whose `CFBundleExecutable` is a plist is opened through the session and `inspect_keyed_archive` reads a bundle-relative archive (fails without the provider routing change with "Invalid analysis input", because the standalone route compared the bundle directory with the executable). - `tests/acceptance/applications/artifactComparisonCoverage.test.ts` and `tests/boundary/mcp/artifactInspectionCoverageMcp.test.ts` exercise the same resolver through MCP and the acceptance workflow; since 1201c2554 their fixture is a Mach-O executable, so they pass on `main` and here and no longer cover this bug. - Base reproduction or other evidence: `git bisect` between a7f50e338 (last green main CI) and ace4dbf36 on `artifactInspectionCoverageMcp.test.ts`: first bad c27560e43; parent 3515b2622 passes. The second blocker was isolated by applying only the classification change and observing `integrity_mismatch` "The opened file was replaced by a directory" from `assertAdmittedRootDigest`. At `main` a95b83c2b (after #7349) the two new `artifactSelectedName` cases still fail on unmodified `main`: 2 failed, `unsupported binary format` for the JavaScript executable and missing `bundleInfoPlist` for the script-stub bundle. - User-visible CLI/MCP output (if applicable): the two existing tests exercise `inspect_artifact` and `compare_artifacts` through the MCP and acceptance workflows. - Remaining proof gaps: not run on Windows or Linux locally (CI covers Linux). No real third-party `.app` with a JavaScript executable was tried. Boundary regressions covered: - Raw identity and normalization: the caller-selected bundle spelling (`artifactSelectedPath`) stays separate from the canonical executable path used for classification and digests (`artifactSelectedName.test.ts`). - Public success and error delivery: `inspect_artifact` and `compare_artifacts` through MCP and the acceptance workflow on a directory bundle (existing regressions). Lifecycle regressions: not applicable; no resource acquisition or cleanup changes. 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 At `55bd343f8` (`main` `2d5dec26c` merged; one conflict in `BinaryTargetResolver.ts`, where `main` added a source-path argument to `detectArtifactFormat` and ESP flash routes that built path, source path and digest inline; they now use the shared `identity()`; macOS 26.5.2, Node 24.22.1): - `npm run test:focused --` `artifactSelectedName`, `keyedArchiveSelection`, `binaryTarget`, `espFlashImageMcp`, `BinarySessionBundleResources`, `TargetFormatVocabularies` — 6 files, 188 passed, 2 skipped - `npm run check:fast` — passed - `npm run format:check` — passed - Not run at this head: `npm run docs:check` and the other files of the earlier nine-file set At `cdadc10b6` (`main` `18a8e71c9` merged; `main` added UnityFS and U-Boot uImage detection to `detectArtifactFormat`, no conflict; macOS 26.5.2, Node 24.22.1): - `npm run test:focused --` the same nine files — 81 passed, 2 skipped - `npm run check:fast` — passed - `npm run docs:check` — passed At `9770575ce` (`main` `5ae77656e` merged; `main` added Intel HEX / S-record detection to `detectArtifactFormat` in `BinaryTargetResolver.ts`, no conflict with the classification change; macOS 26.5.2, Node 24.22.1): - `npm run test:focused --` the same nine files — 81 passed, 2 skipped - `npm run check:fast` — passed - `npm run docs:check` — passed At `dbbd607d7` (`main` `a95b83c2b` merged, macOS 26.5.2, Node 24.22.1): - `npm run test:focused --` `artifactSelectedName`, `keyedArchiveSelection`, `keyedArchiveStandaloneSelection`, `bundleResourceComposition`, `artifactMcp`, `keyedArchivePrototypeKeyMcp`, `dylibResolutionMcp`, `artifactInspectionCoverageMcp`, `artifactComparisonCoverage` — 9 files, 81 passed, 2 skipped - `keyedArchiveSelection.test.ts` with `src/artifacts/ArtifactProvider.ts` reverted: the new bundle case fails ("Invalid analysis input for inspect_keyed_archive") - At `7cf864eb2` with `src/application/BinaryTargetResolver.ts` reverted: the three files fail as on `main` (4 failed: the three existing regressions and the new bundle case) - `npm run check:fast` — passed - `npm run docs:check` — passed - Built CLI E2E on `main` `d1c88fab1` vs this branch: see the PR comment. ## Compatibility, safety, and release - Breaking changes or migration steps: none. Restores the pre-c27560e43 admission of bundle directories; adds `bundleInfoPlist` to non-executable bundle targets. - Real Hopper/Ghidra, browser, or OS coverage: macOS only, local fixtures. - Package or release metadata impact: none. - Security, privacy, process, or containment review: no new process or network access; the digest check now binds to the executable the caller's bundle resolved to. ## Author readiness Human owner: @chordpli - [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 - [ ] 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. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-11-05 01:48:00 +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#7833
No description provided.