[PR #4514] [MERGED] fix(cutter): attribute the host application version #6280

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

📋 Pull Request Information

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

Base: main ← Head: fix/cutter-host-version-4498


📝 Commits (1)

  • ddaacb5 fix(cutter): attribute the host application version

📊 Changes

2 files changed (+45 additions, -4 deletions)

View changed files

📝 bridge/cutter/rea_bridge.py (+4 -3)
📝 tests/fixtures/cutter_bridge_protocol_test.py (+41 -1)

📄 Description

Summary

Fixes #4498. Cutter discovery and command Evidence now identify the Cutter host build instead of misattributing the embedded Rizin version report to it. The correct version also removes repeated backend module-version text from ordinary responses.

Problem and expected behavior

Official Linux Cutter reports 2.5.0-HEAD-a6f6ad7, but the bridge fills cutter_version from CutterCore.getVersionInformation(), which returns Rizin 0.9.1 plus its module versions. The host-version field and provider provenance should identify Cutter or remain unknown.

Change and scope

Read QCoreApplication.applicationVersion() through the existing PySide6/PySide2 binding selection. Capture the nonempty string once per plugin instance, preserving its exact value and leaving absent, malformed or unreadable values unknown. Host build metadata has the application-process lifetime; no live document state is cached. Remove the superseded backend-version stub from document-identity coverage.

Ordinary provenance correction within existing authority; no new provider or execution, injection, mutation or protection-recovery capability. Separate maintainer scope approval is not applicable.

Contract and boundary impact

  • Semantic owner/earliest stage: Python dispatcher initialization reads the Qt application identity already set by Cutter.
  • CLI/MCP/tool catalog: unchanged fields, schemas and commands; existing consumers receive the corrected version through the shared bridge result.
  • Provider/platform compatibility: official Linux Cutter 2.5.0 Qt5 verified; other platforms/bindings unverified at runtime.
  • Evidence/provenance: provider.version and normalized cutter_version identify the same observed host. Unknown host metadata does not inherit a backend version.
  • Authority/cleanup: read-only application metadata; no new target operation, resource owner or cleanup path.
  • Generated/package/install impact: none; no dependencies, artifacts or binaries committed.

Expected effects:

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

The existing bridge status/command exchanges are authenticated loopback requests. The native verification fixture launches its own GUI; this change does not.

Evidence and regression coverage

  • Production Python regression fails against clean base 2c1dee16df7c3839eb1bad115e10d102d6641ea2: a distinct host version is replaced by the backend value. The final producer passes status/command propagation and empty/malformed/exception cases while a backend version remains available, proving no false fallback. Document-identity coverage retains its actual scalar core configuration model.

  • Official Cutter Qt5 --version independently reports cutter 2.5.0-HEAD-a6f6ad7. Actual native workflows on clean base and final committed source perform two CLI and three stdio MCP calls: base returns the Rizin report, final returns the host version in both discovery and both command Evidence fields. Unicode/#? file paths remain exact, source bytes unchanged, disconnect preserves Cutter, and fixture-owned cleanup leaves verified empty lineage.

  • Qt6 plugin loading has a separate upstream issue (rizinorg/cutter#3659); no Qt6 real-provider claim is made. Native UI-command cancellation, real GUI document switching, other OS and same-path identity remain unverified/partial.

  • 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

Final commit ddaacb55f99580be5b25ed30fccddc5453aefadc, based on latest main 2c1dee16df7c3839eb1bad115e10d102d6641ea2:

  • python3 tests/fixtures/cutter_bridge_protocol_test.py — 13 passed; final regressions fail on the immutable base snapshot as expected.
  • npm run test:focused -- 10 relevant Cutter CLI/MCP/provider and mutation-config/workflow files — 66 passed on final committed source, including Python producer coverage.
  • npm run check:ci and npm run docs:check — passed on final committed source.
  • Official Linux Cutter 2.5.0 Qt5 public CLI/stdio MCP workflow — passed, using only the shipped REA bridge.

One completed native task/revision, two CPU cores: base → fix wall 9.64 → 8.75 s, CPU 11.85 → 10.75 s, sampled family peak 1.047 → 1.049 GiB. Shared host/load and uncontrolled caches: no speedup or stable cold-cache claim. Each task uses fresh GUI/profile, CLI and MCP processes; first/subsequent call timings are retained locally.

Full captured wire+CLI JSON o200k_base serialization proxy 835,460 → 833,605, including identical 829,341-token full catalogs. Named two-tool definitions+calls+CLI proxy 8,767 → 6,912 (about 21% lower); 1,855 fewer estimated tokens in the full captured workflow. Run-specific paths/identities also vary. These are serialization proxies, not actual agent model input or billing; actual model token use is unmeasured. No extra calls, schemas or response fields are introduced.

Local evidence: /tmp/rea-4498-cutter-host-version-20261016/ (not a portable CI artifact; essential outcomes are inline).

Compatibility, safety, and release

  • No public schema, migration, dependency or packaging change.
  • Real Linux Qt5 verified; Qt6 and other OS remain unverified. Existing partial document identity is preserved.
  • No new target execution, mutation or process cleanup. Version strings are preserved without display coercion or inferred replacement.

Author readiness

Human owner: @N0zoM1z0

Recorded at the human owner's explicit session instruction to complete readiness declarations and request review. The assistant performed the diff review and checks above; no independent manual human review is claimed.

  • 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/4514 **Author:** [@N0zoM1z0](https://github.com/N0zoM1z0) **Created:** 10/16/2026 **Status:** ✅ Merged **Merged:** 10/16/2026 **Merged by:** [@N0zoM1z0](https://github.com/N0zoM1z0) **Base:** `main` ← **Head:** `fix/cutter-host-version-4498` --- ### 📝 Commits (1) - [`ddaacb5`](https://github.com/morluto/rea/commit/ddaacb55f99580be5b25ed30fccddc5453aefadc) fix(cutter): attribute the host application version ### 📊 Changes **2 files changed** (+45 additions, -4 deletions) <details> <summary>View changed files</summary> 📝 `bridge/cutter/rea_bridge.py` (+4 -3) 📝 `tests/fixtures/cutter_bridge_protocol_test.py` (+41 -1) </details> ### 📄 Description ## Summary Fixes #4498. Cutter discovery and command Evidence now identify the Cutter host build instead of misattributing the embedded Rizin version report to it. The correct version also removes repeated backend module-version text from ordinary responses. ## Problem and expected behavior Official Linux Cutter reports `2.5.0-HEAD-a6f6ad7`, but the bridge fills `cutter_version` from `CutterCore.getVersionInformation()`, which returns Rizin 0.9.1 plus its module versions. The host-version field and provider provenance should identify Cutter or remain unknown. ## Change and scope Read `QCoreApplication.applicationVersion()` through the existing PySide6/PySide2 binding selection. Capture the nonempty string once per plugin instance, preserving its exact value and leaving absent, malformed or unreadable values unknown. Host build metadata has the application-process lifetime; no live document state is cached. Remove the superseded backend-version stub from document-identity coverage. Ordinary provenance correction within existing authority; no new provider or execution, injection, mutation or protection-recovery capability. Separate maintainer scope approval is not applicable. ## Contract and boundary impact - Semantic owner/earliest stage: Python dispatcher initialization reads the Qt application identity already set by Cutter. - CLI/MCP/tool catalog: unchanged fields, schemas and commands; existing consumers receive the corrected version through the shared bridge result. - Provider/platform compatibility: official Linux Cutter 2.5.0 Qt5 verified; other platforms/bindings unverified at runtime. - Evidence/provenance: `provider.version` and normalized `cutter_version` identify the same observed host. Unknown host metadata does not inherit a backend version. - Authority/cleanup: read-only application metadata; no new target operation, resource owner or cleanup path. - Generated/package/install impact: none; no dependencies, artifacts or binaries committed. Expected effects: - [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. - [x] 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. The existing bridge status/command exchanges are authenticated loopback requests. The native verification fixture launches its own GUI; this change does not. ## Evidence and regression coverage - Production Python regression fails against clean base `2c1dee16df7c3839eb1bad115e10d102d6641ea2`: a distinct host version is replaced by the backend value. The final producer passes status/command propagation and empty/malformed/exception cases while a backend version remains available, proving no false fallback. Document-identity coverage retains its actual scalar core configuration model. - Official Cutter Qt5 `--version` independently reports `cutter 2.5.0-HEAD-a6f6ad7`. Actual native workflows on clean base and final committed source perform two CLI and three stdio MCP calls: base returns the Rizin report, final returns the host version in both discovery and both command Evidence fields. Unicode/`#?` file paths remain exact, source bytes unchanged, disconnect preserves Cutter, and fixture-owned cleanup leaves verified empty lineage. - Qt6 plugin loading has a separate upstream issue (rizinorg/cutter#3659); no Qt6 real-provider claim is made. Native UI-command cancellation, real GUI document switching, other OS and same-path identity remain unverified/partial. - [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 Final commit `ddaacb55f99580be5b25ed30fccddc5453aefadc`, based on latest main `2c1dee16df7c3839eb1bad115e10d102d6641ea2`: - `python3 tests/fixtures/cutter_bridge_protocol_test.py` — **13 passed**; final regressions fail on the immutable base snapshot as expected. - `npm run test:focused --` 10 relevant Cutter CLI/MCP/provider and mutation-config/workflow files — **66 passed** on final committed source, including Python producer coverage. - `npm run check:ci` and `npm run docs:check` — passed on final committed source. - Official Linux Cutter 2.5.0 Qt5 public CLI/stdio MCP workflow — passed, using only the shipped REA bridge. One completed native task/revision, two CPU cores: base → fix wall **9.64 → 8.75 s**, CPU **11.85 → 10.75 s**, sampled family peak **1.047 → 1.049 GiB**. Shared host/load and uncontrolled caches: no speedup or stable cold-cache claim. Each task uses fresh GUI/profile, CLI and MCP processes; first/subsequent call timings are retained locally. Full captured wire+CLI JSON `o200k_base` serialization proxy **835,460 → 833,605**, including identical **829,341**-token full catalogs. Named two-tool definitions+calls+CLI proxy **8,767 → 6,912** (about **21% lower**); 1,855 fewer estimated tokens in the full captured workflow. Run-specific paths/identities also vary. These are serialization proxies, not actual agent model input or billing; actual model token use is unmeasured. No extra calls, schemas or response fields are introduced. Local evidence: `/tmp/rea-4498-cutter-host-version-20261016/` (not a portable CI artifact; essential outcomes are inline). ## Compatibility, safety, and release - No public schema, migration, dependency or packaging change. - Real Linux Qt5 verified; Qt6 and other OS remain unverified. Existing partial document identity is preserved. - No new target execution, mutation or process cleanup. Version strings are preserved without display coercion or inferred replacement. ## Author readiness Human owner: @N0zoM1z0 Recorded at the human owner's explicit session instruction to complete readiness declarations and request review. The assistant performed the diff review and checks above; no independent manual human review is claimed. - [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. --- <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:14 +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#6280
No description provided.