diff --git a/Directory.Build.props b/Directory.Build.props
index 49e5141..a651f51 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -20,7 +20,7 @@
$(WarningsNotAsErrors);NU1900;NU1901;NU1902;NU1905
x64
- 2.0.0-beta.3
+ 2.0.0-beta.4
CheatEngineNet
CheatEngineNet
https://github.com/CheatEngineNet/CheatEngine.Mcp
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 1d3f278..0036d32 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -4,8 +4,8 @@
true
-
-
+
+
diff --git a/THIRD-PARTY-NOTICES.md b/THIRD-PARTY-NOTICES.md
index d84de80..160164f 100644
--- a/THIRD-PARTY-NOTICES.md
+++ b/THIRD-PARTY-NOTICES.md
@@ -12,13 +12,13 @@ shipped package has no row.
| Package | Version | License | Copyright | Shipped in | License text |
|---|---|---|---|---|---|
-| CheatEngine.Client | 1.0.0 | MIT | Copyright (c) 2026 AriusII, ShadowNineX and CheatEngine.Client contributors | Metapackage, no files | [MIT License](#mit-license) |
-| CheatEngine.Client.Abstractions | 1.0.0 | MIT | Copyright (c) 2026 AriusII, ShadowNineX and CheatEngine.Client contributors | Embedded plugin dependencies, gateway | [MIT License](#mit-license) |
-| CheatEngine.Client.Core | 1.0.0 | MIT | Copyright (c) 2026 AriusII, ShadowNineX and CheatEngine.Client contributors | Embedded plugin dependencies, gateway | [MIT License](#mit-license) |
-| CheatEngine.Client.Extensions.DependencyInjection | 1.0.0 | MIT | Copyright (c) 2026 AriusII, ShadowNineX and CheatEngine.Client contributors | Embedded plugin dependencies, gateway | [MIT License](#mit-license) |
-| CheatEngine.Client.Fluent | 1.0.0 | MIT | Copyright (c) 2026 AriusII, ShadowNineX and CheatEngine.Client contributors | Embedded plugin dependencies, gateway | [MIT License](#mit-license) |
-| CheatEngine.Client.Hosting | 1.0.0 | MIT | Copyright (c) 2026 AriusII, ShadowNineX and CheatEngine.Client contributors | Embedded plugin dependencies, gateway | [MIT License](#mit-license) |
-| CheatEngine.SDK | 2.0.0 | MIT | Copyright (c) 2026 AriusII, ShadowNineX and CheatEngine.SDK contributors | Embedded plugin dependencies: the seven `CheatEngine.SDK*.dll` assemblies and the native `cheatengine-sdk-lua-bridge.dll`. Gateway: the managed assemblies only | [MIT License](#mit-license) |
+| CheatEngine.Client | 1.1.0 | MIT | Copyright (c) 2026 AriusII, ShadowNineX and CheatEngine.Client contributors | Metapackage, no files | [MIT License](#mit-license) |
+| CheatEngine.Client.Abstractions | 1.1.0 | MIT | Copyright (c) 2026 AriusII, ShadowNineX and CheatEngine.Client contributors | Embedded plugin dependencies, gateway | [MIT License](#mit-license) |
+| CheatEngine.Client.Core | 1.1.0 | MIT | Copyright (c) 2026 AriusII, ShadowNineX and CheatEngine.Client contributors | Embedded plugin dependencies, gateway | [MIT License](#mit-license) |
+| CheatEngine.Client.Extensions.DependencyInjection | 1.1.0 | MIT | Copyright (c) 2026 AriusII, ShadowNineX and CheatEngine.Client contributors | Embedded plugin dependencies, gateway | [MIT License](#mit-license) |
+| CheatEngine.Client.Fluent | 1.1.0 | MIT | Copyright (c) 2026 AriusII, ShadowNineX and CheatEngine.Client contributors | Embedded plugin dependencies, gateway | [MIT License](#mit-license) |
+| CheatEngine.Client.Hosting | 1.1.0 | MIT | Copyright (c) 2026 AriusII, ShadowNineX and CheatEngine.Client contributors | Embedded plugin dependencies, gateway | [MIT License](#mit-license) |
+| CheatEngine.SDK | 2.0.1 | MIT | Copyright (c) 2026 AriusII, ShadowNineX and CheatEngine.SDK contributors | Embedded plugin dependencies: the seven `CheatEngine.SDK*.dll` assemblies and the native `cheatengine-sdk-lua-bridge.dll`. Gateway: the managed assemblies only | [MIT License](#mit-license) |
| Costura.Fody | 6.2.0 | MIT | Copyright (c) 2012 Simon Cropp and contributors | Plugin: embedded dependencies and injected loader code | [MIT License](#mit-license) |
| Microsoft.Extensions.AI.Abstractions | 10.10.1 | MIT | Copyright (c) .NET Foundation; © Microsoft Corporation | Embedded plugin dependencies, gateway | [MIT License](#mit-license) |
| ModelContextProtocol | 2.2.0 | Apache-2.0 (MIT for earlier contributions not yet relicensed) | © Model Context Protocol a Series of LF Projects, LLC. | Embedded plugin dependencies, gateway | [Apache License 2.0](#apache-license-20), [MIT License](#mit-license) |
@@ -62,8 +62,8 @@ SDK changes the runtime version, update this table.
| Component | Upstream license file |
|---|---|
-| CheatEngine.Client 1.0.0 | (the source commit of the packages) |
-| CheatEngine.SDK 2.0.0 | (the source commit of the package) |
+| CheatEngine.Client 1.1.0 | (the source commit of the packages) |
+| CheatEngine.SDK 2.0.1 | (the source commit of the package) |
| Microsoft.Extensions.AI.Abstractions 10.10.1 | (the source commit of the package) |
| ModelContextProtocol 2.2.0 | and (the source commit of the packages) |
| .NET runtime packs 10.0.12 | `LICENSE.TXT` and `THIRD-PARTY-NOTICES.TXT` of the runtime packs |
diff --git a/docs/beta4-release-notes.md b/docs/beta4-release-notes.md
new file mode 100644
index 0000000..807b6e7
--- /dev/null
+++ b/docs/beta4-release-notes.md
@@ -0,0 +1,24 @@
+# CheatEngine.Mcp 2.0.0-beta.4
+
+This Windows x64 prerelease updates the Client/SDK dependencies, fixes two tool adapters and expands automated coverage across the complete MCP catalog. Download `CheatEngine.Mcp-2.0.0-beta.4-win-x64.zip` and verify it with `SHA256SUMS.txt`. The ZIP contains the single plugin DLL, matching gateway executable, installation instructions and licenses.
+
+## Changes since beta.3
+
+- Updated `CheatEngine.Client` to 1.1.0 and `CheatEngine.SDK` to 2.0.1, including regenerated normal and Native AOT dependency locks.
+- Fixed `code_get_comments` so its address array reaches Lua as one argument, and fixed `process_list_threads` to use CE's documented zero-based StringList indexer.
+- Added catalog-derived routing/refusal checks for every backend tool, positive adapter evidence for all 193 backend tools, and gateway-local discovery checks. New catalog entries must have reviewed adapter-test mappings.
+- Expanded standalone Lua adapter tests and execution-argument, conversion/calculation and pointer-file boundary, failure and cleanup tests.
+- Added a bounded live workflow scenario that tests target, gateway and host restarts independently of the unresolved plugin reload bridge.
+- Preserved the latest test-platform package updates from `main`.
+
+## Validation and known limits
+
+The recorded automated baseline passes 5,314 portable tests in both Debug and Release and 651 standalone Lua tests, with no failures or skips. Combined coverage reaches 94.50% of instrumented handwritten product C# lines, including 94.37% in Tools. This C# percentage does not measure embedded Lua branch coverage or native CE behavior.
+
+The release pipeline checks the isolated bundled DLL, reflected catalog, Native AOT gateway smoke responses, ZIP contents and checksums. Native evidence for 37 backend tools comes from the separately identified private dependency-refresh candidate recorded in the [all-tool qualification report](https://github.com/CheatEngineNet/CheatEngine.Mcp/blob/main/docs/qualification/all-tools/README.md); it does not qualify newly rebuilt release bytes. Another 156 backend tools still need native success fixtures, and same-process plugin reload remains unqualified. SDK provider-stack guards reject invalid states; the original intermittent dispatcher corruption was investigated, but its root cause remains unresolved. This beta is not stable v2.0.0 sign-off.
+
+## Installation, upgrade and rollback
+
+Use Cheat Engine 7.7 x64 with the x64 .NET 10, ASP.NET Core 10 and Windows Desktop 10 runtimes. The gateway is self-contained. All four optional execution capabilities remain enabled by default; configure their exposure for your setup. The recorded bounded native workflows explicitly disabled them.
+
+Back up the previous matching plugin/gateway pair, configuration and CE settings. Disable the plugin and close CE and the gateway before extracting beta.4 into a new folder. Install `CheatEngine.Mcp.dll`, point the MCP client at the matching `CheatEngine.Mcp.Gateway.exe`, then use `instance_list` to discover a fresh instance ID. Keep both binaries from the same ZIP. To roll back, close both processes and restore the previous matching pair and registration. See the [recovery guide](https://github.com/CheatEngineNet/CheatEngine.Mcp/blob/main/srcs/CheatEngine.Mcp.Resources/Knowledge/Documents/connection-troubleshooting.md#several-instances-updates-and-removal) for locked files and partial upgrades.
diff --git a/docs/qualification/all-tools/README.md b/docs/qualification/all-tools/README.md
new file mode 100644
index 0000000..93acca5
--- /dev/null
+++ b/docs/qualification/all-tools/README.md
@@ -0,0 +1,224 @@
+# Full tool qualification
+
+The current catalog contains 193 backend tools and the gateway's `instance_list` tool.
+Every tool needs a reviewed success case with known inputs, an independent result or side-effect oracle,
+and cleanup verification. Catalog discovery, routing, disabled-feature refusals and compilation of a fixed
+Lua body do not establish successful native execution.
+
+## Checklist
+
+- [x] Enumerate the complete advertised catalog.
+- [x] Check routing, missing/unknown instance refusal and stale-identity refusal for every backend tool.
+- [x] Check gateway-local discovery with zero and two instances.
+- [x] Run the portable Release suite; final results are recorded below.
+- [x] Run the portable Debug suite with the same exclusions.
+- [x] Run standalone Lua 5.3 with CE API doubles (651 passed, zero failed or skipped).
+- [x] Add and run result assertions for the Lua, table-save and code-view adapters (12 passed).
+- [x] Add seven record adapter cases and four code/process adapter cases; run both focused classes.
+- [x] Fix the `code_get_comments` array argument expansion found by those tests.
+- [x] Fix `process_list_threads` to use CE's documented zero-based StringList indexer; verify empty, truncated and error cleanup paths.
+- [x] Prepare eight additional bounded live cases and review their assertions.
+- [x] Attempt the private x64 lifecycle session against the published beta.3 bundle.
+- [x] Verify both private hosts stopped, user state was restored and the installed CE files stayed unchanged.
+- [ ] Qualify same-process plugin reload: the Settings bridge observes zero plugin rows after `loadPlugin` succeeded.
+- [x] Add a separate disabled-capability workflow scenario so independent restart checks can complete.
+- [x] Run the eight added live checks and six bounded workflows, then target, gateway and host restarts.
+- [x] Map a positive production-adapter result/effect assertion for every backend tool.
+- [x] Add SDK provider-stack containment and normal-path preservation regressions.
+- [x] Exercise the SDK dispatcher with rooted worker/main coroutines, including queued-stop cleanup.
+- [x] Prepare, review and run a bounded provider trace replay; retain non-reproduction as diagnostic evidence only.
+- [x] Add direct adapter checks for managed collectors, debugger callbacks, execution, kernel calls, patches and table loading using doubles.
+- [x] Update to published Client 1.1.0 and SDK 2.0.1; regenerate portable and AOT lockfiles.
+- [x] Require reviewed positive adapter mappings for every name in the production tool catalog.
+- [x] Add execution-argument, conversion/calculation and pointer-file boundary/failure tests.
+- [x] Measure handwritten product C# coverage using fresh portable and NativeLua reports.
+- [x] Rebuild and repeat the disabled-capability workflows on the updated dependency bundle.
+- [ ] Supply native managed collector, Mono, debugger event, compiler/ABI, PDB/export, table and patch fixtures.
+- [ ] Qualify successful gated operations and DBK/DBVM operations in their required environments.
+- [ ] Qualify all tools on the exact replacement product bundle after fixes, including restart and cleanup.
+
+The machine-readable report contains one row for each of the 194 tools. It keeps routing, tests using
+doubles, direct fixed-Lua bodies and live results separate. The reviewed
+[`behavior-evidence.json`](behavior-evidence.json) maps positive adapter evidence for all 193 backend names.
+Each mapped test lists its exact required TRX case names; every case must occur once and pass.
+Passing only one branch of a parameterized test cannot qualify another branch's tool.
+These cases use Client or CE API doubles, including real standalone Lua where applicable. They are partial
+cases, not complete behavior partitions or native CE qualification. The gateway's local discovery checks
+bring the advertised catalog total to 194. A live mapping requires its own concrete oracle and cleanup receipts.
+
+## Automated results from 2026-10-16
+
+The dependency refresh uses the published NuGet packages `CheatEngine.Client` **1.1.0** and
+`CheatEngine.SDK` **2.0.1**. Both normal and AOT lockfiles were regenerated. Debug and Release builds
+completed with zero warnings or errors. The isolated bundled-DLL reflection/load probe and the published
+Native AOT gateway smoke check also passed.
+
+Fresh final TRX reports contain:
+
+| Suite | Passed | Failed | Skipped |
+| --- | ---: | ---: | ---: |
+| Portable Release | 5,314 | 0 | 0 |
+| Portable Debug | 5,314 | 0 | 0 |
+| Standalone NativeLua | 651 | 0 | 0 |
+| Opt-in live Workflows session | 1 | 0 | 0 |
+
+The generated report verifies routing for all **194** advertised tools, positive adapter evidence for
+all **193** backend tools, and the exact required parameterized cases. The added
+`AllToolBehaviorEvidenceTests` derives its names from the production catalog and checks that every
+adapter mapping references an existing public test, source file, oracle and case list. This structural
+guard does not execute the mapped test or prove its outcome; the report checks the fresh TRX results.
+The report records input hashes but does not independently attest that a supplied TRX came from current source.
+
+Additional tests pin execution argument types and numeric limits, indexed validation errors, timeout
+endpoints and symbol-lookup failure semantics. Conversion/calculator tests cover byte order, fixed scalar
+values, operator precedence, invalid expressions and resource limits. Pointer-file tests cover schema
+and snapshot validation, incomplete coverage, chunked nonseekable reads, stream ownership and failures
+before writes. These checks use deterministic inputs and result, error or side-effect assertions.
+
+Combined portable and standalone Lua coverage reaches **20,193 / 21,369 handwritten product C# lines
+(94.50%)**. Hits are unioned by source file and line; generated files and test code are excluded.
+This percentage does not measure embedded Lua branch coverage or prove native host behavior.
+
+| Product project | Covered / instrumented lines | Line coverage |
+| --- | ---: | ---: |
+| Core | 4,357 / 4,581 | 95.11% |
+| Gateway entry point | 9 / 10 | 90.00% |
+| Hosting | 1,228 / 1,348 | 91.10% |
+| Plugin | 794 / 851 | 93.30% |
+| Prompts | 704 / 709 | 99.29% |
+| Resources | 222 / 222 | 100.00% |
+| Tools | 12,879 / 13,648 | 94.37% |
+
+The separate static source-to-test pairing analyzer could not parse this repository's C# 14 extension
+blocks with its bundled Roslyn 4.14. Its partial classifications are not used as coverage evidence.
+
+The current private x64 run `20261016T174241Z-e914` passed the eight additional checks, six bounded
+workflows and one restart each of target A, gateway and host A. All four optional gates were explicitly
+disabled, and zero plugin reload cycles were requested. The session passed in about 37 seconds, restored
+user state, left the source installation unchanged and reported no cleanup failures. The runner also
+confirmed that no recorded owned processes remained. Its 813 prepared inputs matched their manifest.
+
+The report verifies **37 backend tools** against this run's exact primary and cleanup receipts.
+The other **156 backend tools** still lack native success evidence; gateway-local `instance_list` has
+its separate discovery tests. Same-process plugin reload and the native fixtures listed above remain
+unqualified. `nativeQualificationComplete` remains false.
+
+Current private bundle SHA-256 values:
+
+- DLL: `8C01D51F78642FF036E4616032A541D5DE2BD534006D9FF51C8C97B81FC33AE8`
+- Gateway: `664EB1CD2756ED076C443446A6D09A151CEB30CA43BB69BC2392555C3BEFD2E3`
+
+Fresh TRX and Cobertura files are under `artifacts/test-results/all-tools-20261016/` in
+`portable-reviewed`, `portable-debug-reviewed`, `native-reviewed` and `live`. The per-tool report is
+`tool-report-final/tool-results.json`, and the deduplicated line totals are in
+`product-coverage-final.json`. These local artifacts and raw native logs are not committed.
+Installed and released binaries have not been replaced by this work.
+
+## Automated results from 2026-10-11
+
+The final portable suites passed in both Debug and Release: 5,046 tests each, zero failures or skips.
+The final standalone NativeLua suite passed 651 tests, zero failures or skips. The report generated from
+the Release and NativeLua TRX files verifies positive adapter evidence for all 193 backend tools.
+It also verifies routing for all backend tools and the gateway's own discovery cases.
+
+[`live-evidence.json`](live-evidence.json) maps 37 positive native tool cases from the reviewed workflow
+session below. Each case requires its primary receipt and any mapped cleanup receipt, along with a passed
+session, restored user state, an unchanged source installation and no cleanup failures. These 37 cases
+do not establish native qualification of the entire catalog.
+
+## Failure observed on 2026-10-11
+
+The ordinary x64 lifecycle session used the published `2.0.0-beta.3+059f249cc3293dff65b19ca257ecfe196d20aac1`
+plugin and gateway, with all four optional gates disabled. Reading the second instance's runtime resource
+failed with `The Lua stack does not contain the inputs required by the protected operation.`
+The stack trace reaches `LuaProtectedApi.PushBytes`, `LuaState.TryGetGlobal` and
+`MainThreadDispatcher.Dispatch` before the MCP operation body starts. This identifies the failure
+boundary; it does not prove its underlying cause. No automatic native retry was made.
+
+The private run is `20261011T134351Z-8024`. Its final summary reports `passed: false`,
+`userStateRestored: true`, `sourceInstallationUnchanged: true` and no cleanup failures.
+The eight added live cases were not reached in that run. Raw logs and discovery material stay
+in the private run directory; they are not committed.
+
+The `code_get_comments` fix is currently a source change. The installed/released beta.3 bundle has not
+been replaced by this work. The regression checks two ordered addresses through the actual managed
+adapter and real Lua 5.3 with CE API doubles, avoiding the array-shape bypass in the previous compile-only case.
+
+## Later native results from 2026-10-11
+
+The ordinary SDK candidate first reached the new checks in `20261011T144953Z-1ce8`, exposing an incorrect
+test assumption that a target selected before plugin activation must have a positive selection epoch.
+Client legitimately starts at zero; the test now checks a nonnegative epoch and verifies that setting the
+same pointer size preserves it.
+
+Run `20261011T145414Z-f9a6` then found a production bug: `process_list_threads` read `list.Strings[i]`,
+but the installed CE reference documents `list[i]` (or `list.String[i]`). The previous double supplied
+the unsupported property. The fix uses `list[i]`, and regression doubles expose only numeric entries.
+All 637 standalone Lua tests passed after that fix; further adapter additions bring the final total to 651.
+
+Candidate 2 ran all eight added checks and six workflows successfully in `20261011T150242Z-86a0`,
+then failed at the separate Plugin Manager bridge: its checklist remained empty. The earlier experiment
+that retained the empty `Plugins64` key failed the same way. Installed CE 7.7 internals are not available;
+we have no supported Lua workaround for host-driven disable/re-enable. The exact plugin-row guard stays intact.
+
+The dedicated `workflows` scenario passed in `20261011T151957Z-8cfc` in 33.5 seconds. It explicitly
+stages all four optional gates disabled, checks the eight tools and six workflows, restarts target A,
+restarts the gateway, then restarts host A while checking host B and rejecting stale identities. It records
+zero plugin cycles. Its final summary reports `passed: true`, `userStateRestored: true`,
+`sourceInstallationUnchanged: true` and an empty cleanup-failure list. No recorded owned processes remained.
+
+That private candidate uses SDK `2.0.1-mcpqualification.1` with the provider guards below. Its bundled DLL
+and AOT gateway passed isolated catalog/load probes and gateway smoke checks. DLL SHA-256:
+`F0DA5938E8CABE34C7BED9CCEE16FFE92C5731D9E37A9F2546835576DA594D68`; gateway SHA-256:
+`E8547E93BF97BE9D0EFA07E225A27A4A6B41000454834CBF7B03A7FD10664C44`.
+The private runner verified 930 input hashes before launch. This candidate is neither installed nor released.
+
+Its ordinary native bridge uses the checked-in SDK binary (`889DC4C2...`), whereas the diagnostic package
+used the released CI-built binary (`B008C8D8...`). Their recorded native source/build fingerprints match;
+the binaries are not byte-identical. PE and package audits passed. Successful private runs do not establish
+that the original released-bundle dispatcher failure is resolved.
+
+## SDK investigation from 2026-10-11
+
+The SDK source now refuses a provider state with a negative stack top before stamp verification or dispatch.
+It also verifies that stamp checking preserves the stack top. Both failures release the operation admission
+through the existing exception path; they do not reset the stack or retry the provider. These checks contain
+an invalid state. They do not fix or explain the original corruption.
+
+Standalone SDK evidence: 278 native-Lua tests passed, 14 main-thread/coroutine tests passed, and the focused
+provider/runtime run passed 14 tests. The rooted-coroutine fixture models the published CE 7.5 topology;
+it does not establish the internals of the installed CE 7.7 host.
+
+The private diagnostic package `CheatEngine.SDK.2.0.1-mcpprovidertrace.2` was used in
+`20261011T144032Z-1764`. The bounded resource/memory/scanner/AOB replay passed, restored user state,
+left the installation unchanged and stopped all recorded owned processes. Host A recorded 3,593 trace
+events and host B recorded 266. All 397 provider-returned states had nonnegative tops and stamp checking
+preserved them. Neither trace froze, overflowed nor contained an incomplete record. The failure did not
+reproduce; this is not root-cause resolution or full native qualification.
+
+An earlier candidate replay, `20261011T143815Z-b0c8`, also passed and restored state, but no trace was
+created because the private harness had not forwarded the trace opt-in to its sanitized child environment.
+That harness omission was corrected and reviewed before the recorded replay. Neither replay reached the
+eight additional lifecycle checks. Raw traces, host logs and discovery material remain private.
+
+Client's dispatcher delegates to synchronous SDK invocation. No Client production change is supported by
+the observed failure. Installed and released binaries remain unchanged.
+
+## Reproduce the evidence report
+
+Build and run the repository's portable and NativeLua categories as documented in
+`tests/CheatEngine.Mcp.Tests/README.md`, with TRX reports enabled. Then run:
+
+```powershell
+./eng/Write-AllToolQualificationReport.ps1 `
+ -GatewayTrx artifacts/test-results/all-tools-20261016/portable-reviewed/CheatEngine.Mcp.Tests_net10.0_x64.trx `
+ -PortableTrx artifacts/test-results/all-tools-20261016/portable-reviewed/CheatEngine.Mcp.Tests_net10.0_x64.trx `
+ -NativeLuaTrx artifacts/test-results/all-tools-20261016/native-reviewed/CheatEngine.Mcp.Tests_net10.0_x64.trx `
+ -OutputDirectory artifacts/test-results/all-tools-20261016/tool-report-final
+```
+
+The output is `tool-results.json` inside that output directory. Supply `-LiveSummary` with the private
+session's `summary.json` to include its outcome. A receipt from a failed session is marked
+`observed_in_failed_session`, never `verified`. Missing or duplicate routing cases leave their row
+incomplete. `nativeQualificationComplete` stays false until the full per-tool native acceptance matrix
+is implemented and reviewed; this report does not infer qualification from suite counts.
diff --git a/docs/qualification/all-tools/behavior-evidence.json b/docs/qualification/all-tools/behavior-evidence.json
new file mode 100644
index 0000000..e95cedc
--- /dev/null
+++ b/docs/qualification/all-tools/behavior-evidence.json
@@ -0,0 +1,3189 @@
+{
+ "schema": "cheatengine-mcp-behavior-evidence/v1",
+ "boundary": "Reviewed existing success assertions are partial evidence. Fixed Lua bodies bypass the adapter and do not qualify it. No row establishes native CE success.",
+ "tools": [
+ {
+ "name": "aob_find",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.AobFind_IncludeMapped_OverrideIsOnDuringEveryPatternScanAndEndsOnce",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaAobMappedTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([\"401000\"], result.Results[0].Matches); Assert.Equal(new object?[] { true, true }, duringScans);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.AobFind_IncludeMapped_OverrideIsOnDuringEveryPatternScanAndEndsOnce"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "aob_find_value",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Aob.AobToolsTests.FindValue_Value_IsEncodedAsTheTargetBytesWithItsDefaultAlignment",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Aob/AobToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(pattern, request!.Value.Pattern.Value); Assert.Equal([\"401000\"], result.Result.Matches); Assert.Equal(1, target.Dispatcher.Calls);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Aob.AobToolsTests.FindValue_Value_IsEncodedAsTheTargetBytesWithItsDefaultAlignment(valueType: Double, value: \"1\", pattern: \"00 00 00 00 00 00 F0 3F\", alignment: 4)",
+ "CheatEngine.Mcp.Tests.Tools.Aob.AobToolsTests.FindValue_Value_IsEncodedAsTheTargetBytesWithItsDefaultAlignment(valueType: Float, value: \"1.5\", pattern: \"00 00 C0 3F\", alignment: 4)",
+ "CheatEngine.Mcp.Tests.Tools.Aob.AobToolsTests.FindValue_Value_IsEncodedAsTheTargetBytesWithItsDefaultAlignment(valueType: Int16, value: \"-2\", pattern: \"FE FF\", alignment: 2)",
+ "CheatEngine.Mcp.Tests.Tools.Aob.AobToolsTests.FindValue_Value_IsEncodedAsTheTargetBytesWithItsDefaultAlignment(valueType: Int32, value: \"100\", pattern: \"64 00 00 00\", alignment: 4)",
+ "CheatEngine.Mcp.Tests.Tools.Aob.AobToolsTests.FindValue_Value_IsEncodedAsTheTargetBytesWithItsDefaultAlignment(valueType: Int64, value: \"1\", pattern: \"01 00 00 00 00 00 00 00\", alignment: 4)",
+ "CheatEngine.Mcp.Tests.Tools.Aob.AobToolsTests.FindValue_Value_IsEncodedAsTheTargetBytesWithItsDefaultAlignment(valueType: Int8, value: \"-1\", pattern: \"FF\", alignment: 1)",
+ "CheatEngine.Mcp.Tests.Tools.Aob.AobToolsTests.FindValue_Value_IsEncodedAsTheTargetBytesWithItsDefaultAlignment(valueType: String, value: \"Hi\", pattern: \"48 69\", alignment: 1)",
+ "CheatEngine.Mcp.Tests.Tools.Aob.AobToolsTests.FindValue_Value_IsEncodedAsTheTargetBytesWithItsDefaultAlignment(valueType: UInt32, value: \"0xDEADBEEF\", pattern: \"EF BE AD DE\", alignment: 4)",
+ "CheatEngine.Mcp.Tests.Tools.Aob.AobToolsTests.FindValue_Value_IsEncodedAsTheTargetBytesWithItsDefaultAlignment(valueType: UInt8, value: \"0x7F\", pattern: \"7F\", alignment: 1)",
+ "CheatEngine.Mcp.Tests.Tools.Aob.AobToolsTests.FindValue_Value_IsEncodedAsTheTargetBytesWithItsDefaultAlignment(valueType: WString, value: \"Hi\", pattern: \"48 00 69 00\", alignment: 1)"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "aob_generate_signature",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Aob.AobToolsTests.GenerateSignature_UniquePattern_NormalizesWildcardsAndVerifiesTheMatchStart",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Aob/AobToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new AobSignature(\"401002\", \"game.exe\", AobSignatureGenerator.CheatEngine, true, true, \"48 8B ?? 05\", \"401000\", 2, 4, 1), signature);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Aob.AobToolsTests.GenerateSignature_UniquePattern_NormalizesWildcardsAndVerifiesTheMatchStart"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "asm_apply",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.ApplyAndCodePatch_RetainExactLeaseMetadataAndReleaseOriginalDisable",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CodeAsmTableV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Exact supplied/generated ENABLE and DISABLE bytes; retained lease metadata, one release, empty patch/resource lists afterward.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.ApplyAndCodePatch_RetainExactLeaseMetadataAndReleaseOriginalDisable(codePatch: False)"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "asm_apply_code_patch",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.ApplyAndCodePatch_RetainExactLeaseMetadataAndReleaseOriginalDisable",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CodeAsmTableV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Exact supplied/generated ENABLE and DISABLE bytes; retained lease metadata, one release, empty patch/resource lists afterward.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.ApplyAndCodePatch_RetainExactLeaseMetadataAndReleaseOriginalDisable(codePatch: True)"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "asm_assemble",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.Assemble_SequentialInstructions_ForwardActualOriginsAndEncodingOptions",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CoreAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "8BC3C3 bytes, lengths and source order, origins 401000 then 401002, exact encoding/range-check requests.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.Assemble_SequentialInstructions_ForwardActualOriginsAndEncodingOptions"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "asm_check",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.Check_AcceptedEnable_AlsoChecksTheDisableSection",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CodeAsmTableV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new AsmCheckResult(false, \"Error in line 4 (bad) :This instruction can't be compiled\", false, AsmScriptSection.Disable), result);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.Check_AcceptedEnable_AlsoChecksTheDisableSection"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "asm_generate_api_hook",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.AsmV2_GenerateApiHook_JoinsCheatEnginesTwoSectionsAndPreservesEveryArgument",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaAsmDebuggerV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(expectedScript, generated.Script); Assert.Equal((\"401000\", \"401005\", \"newCall\", \"x64\", true), observed globals);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.AsmV2_GenerateApiHook_JoinsCheatEnginesTwoSectionsAndPreservesEveryArgument"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "asm_generate_injection",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.GenerateInjection_ProducesReviewedRollbackScript",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CodeAsmTableV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((\"48895C2408\", \"mcpHook\"), (result.ExpectedBytes, result.SymbolName)); Assert.Contains(\"[DISABLE]\", result.Script);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.GenerateInjection_ProducesReviewedRollbackScript"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "asm_list_patches",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.ApplyAndCodePatch_RetainExactLeaseMetadataAndReleaseOriginalDisable",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CodeAsmTableV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Exact supplied/generated ENABLE and DISABLE bytes; retained lease metadata, one release, empty patch/resource lists afterward.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.ApplyAndCodePatch_RetainExactLeaseMetadataAndReleaseOriginalDisable(codePatch: False)",
+ "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.ApplyAndCodePatch_RetainExactLeaseMetadataAndReleaseOriginalDisable(codePatch: True)"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "asm_release_patch",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.ReleasePatch_CompletedLease_ForgetsTheRetainedPatchAndResource",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CodeAsmTableV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.True(stopped.Released); Assert.Empty(harness.Resources.List());",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.ReleasePatch_CompletedLease_ForgetsTheRetainedPatchAndResource"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "code_clear_dissect",
+ "cases": [
+ {
+ "suite": "portable",
+ "scope": "adapter",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DissectorViews_MapFixedLuaPagesAndClearSideEffect",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CoreAdapterQualificationTests.cs",
+ "oracle": "Known reference, string, function-page and clear result fields are asserted; the four fixed-Lua operation names occur in the requested order.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DissectorViews_MapFixedLuaPagesAndClearSideEffect"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "code_decode",
+ "cases": [
+ {
+ "suite": "portable",
+ "scope": "adapter",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DecodeAndDisassemble_MapTypedInstructionsInRequestedOrder",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CoreAdapterQualificationTests.cs",
+ "oracle": "Known typed or fixed-Lua snapshots are asserted against the returned tool result; exact forwarded requests and operation order are also checked.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DecodeAndDisassemble_MapTypedInstructionsInRequestedOrder"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "code_disassemble",
+ "cases": [
+ {
+ "suite": "portable",
+ "scope": "adapter",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DecodeAndDisassemble_MapTypedInstructionsInRequestedOrder",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CoreAdapterQualificationTests.cs",
+ "oracle": "Known typed or fixed-Lua snapshots are asserted against the returned tool result; exact forwarded requests and operation order are also checked.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DecodeAndDisassemble_MapTypedInstructionsInRequestedOrder"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "code_disassemble_bytes",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.CodeDisassembleBytes_SpacedText_ReachesDisassembleBytesAsContiguousDigits",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaCodeTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new CodeByteDisassembly(\"1000\", \"mov rax,[00001007]\"), result); Assert.Equal((\"488B0500000000\", 0x1000L), (ReadGlobal(\"receivedBytes\"), ReadGlobal(\"receivedOrigin\")));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.CodeDisassembleBytes_SpacedText_ReachesDisassembleBytesAsContiguousDigits"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "code_find_references",
+ "cases": [
+ {
+ "suite": "portable",
+ "scope": "adapter",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DissectorViews_MapFixedLuaPagesAndClearSideEffect",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CoreAdapterQualificationTests.cs",
+ "oracle": "Known reference, string, function-page and clear result fields are asserted; the four fixed-Lua operation names occur in the requested order.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DissectorViews_MapFixedLuaPagesAndClearSideEffect"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "code_find_strings",
+ "cases": [
+ {
+ "suite": "portable",
+ "scope": "adapter",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DissectorViews_MapFixedLuaPagesAndClearSideEffect",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CoreAdapterQualificationTests.cs",
+ "oracle": "Known reference, string, function-page and clear result fields are asserted; the four fixed-Lua operation names occur in the requested order.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DissectorViews_MapFixedLuaPagesAndClearSideEffect"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "code_get_comments",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.CodeComments_StubbedApi_KeepsReadOrderAndWritesTheRequestedComment",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaCodeQualificationTests.cs",
+ "scope": "fixed_lua_body",
+ "oracle": "Assert.Equal([new CodeComment(\"401000\", \"entry\"), new CodeComment(\"402000\", null)], read.Comments);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.CodeComments_StubbedApi_KeepsReadOrderAndWritesTheRequestedComment"
+ ]
+ },
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CodeTableQualificationTests.CodeComments_ForwardOrderedExpressionsAndReturnTheFixedLuaValues",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CodeTableQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Ordered arguments and all comment result fields",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CodeTableQualificationTests.CodeComments_ForwardOrderedExpressionsAndReturnTheFixedLuaValues"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "code_get_function",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.CodeGetFunction_StubbedApi_ReturnsBoundariesAndJumpDestination",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaCodeQualificationTests.cs",
+ "scope": "fixed_lua_body",
+ "oracle": "Assert.Equal(new CodeLuaFunction(true, \"401020\", \"401000\", \"401080\", 128, true), result);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.CodeGetFunction_StubbedApi_ReturnsBoundariesAndJumpDestination"
+ ]
+ },
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CodeTableQualificationTests.CodeGetFunction_MapsKnownBoundariesAndJumpDestination",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CodeTableQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Independent boundaries, size and jump destination",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CodeTableQualificationTests.CodeGetFunction_MapsKnownBoundariesAndJumpDestination"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "code_get_function_graph",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Code.CodeFunctionGraphTests.GetFunctionGraph_LoopBranchAndCalls_SplitsBlocksAtEveryLeader",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Code/CodeFunctionGraphTests.cs",
+ "scope": "adapter",
+ "oracle": "Exact five block boundaries/terminators/successors, direct and indirect calls, ten instructions and symbol lookup.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Code.CodeFunctionGraphTests.GetFunctionGraph_LoopBranchAndCalls_SplitsBlocksAtEveryLeader"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "code_list_functions",
+ "cases": [
+ {
+ "suite": "portable",
+ "scope": "adapter",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DissectorViews_MapFixedLuaPagesAndClearSideEffect",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CoreAdapterQualificationTests.cs",
+ "oracle": "Known reference, string, function-page and clear result fields are asserted; the four fixed-Lua operation names occur in the requested order.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DissectorViews_MapFixedLuaPagesAndClearSideEffect"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "code_poll_job",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DissectJob_KnownRange_PollsRetainedEventAndReleasesJob",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CoreAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known 16-byte range and completed progress, one retained dissect event, cursor/repeat-poll semantics, stopped job and empty resources.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DissectJob_KnownRange_PollsRetainedEventAndReleasesJob"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "code_set_comment",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.CodeComments_StubbedApi_KeepsReadOrderAndWritesTheRequestedComment",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaCodeQualificationTests.cs",
+ "scope": "fixed_lua_body",
+ "oracle": "Assert.Equal(new CodeComment(\"403000\", \"updated\"), written); Assert.Equal((0x403000L, \"updated\"), globals);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.CodeComments_StubbedApi_KeepsReadOrderAndWritesTheRequestedComment"
+ ]
+ },
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CodeTableQualificationTests.CodeSetComment_ForwardsExactAddressAndBlankCommentToTheFixedBody",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CodeTableQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Exact address/blank comment and returned fields",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CodeTableQualificationTests.CodeSetComment_ForwardsExactAddressAndBlankCommentToTheFixedBody"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "code_start_dissect",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DissectJob_KnownRange_PollsRetainedEventAndReleasesJob",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CoreAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known 16-byte range and completed progress, one retained dissect event, cursor/repeat-poll semantics, stopped job and empty resources.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.DissectJob_KnownRange_PollsRetainedEventAndReleasesJob"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "code_start_search",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.StartSearch_StopWhileNativeCallRuns_ReportsPartialThenReleasesTheJob",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CodeAsmTableV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.True(stopped.AlreadyReleased); Assert.Equal(JobState.Stopped, job.State);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.StartSearch_StopWhileNativeCallRuns_ReportsPartialThenReleasesTheJob"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_attach",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/status/context/register/thread/stack results and exact continuation/control arguments through inert CE APIs.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_break_thread",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/status/context/register/thread/stack results and exact continuation/control arguments through inert CE APIs.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_continue",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/status/context/register/thread/stack results and exact continuation/control arguments through inert CE APIs.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_delete_breakpoint",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_BreakpointLifecycle_TracksThenReleasesTheKnownOwnedBreakpoint",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known breakpoint attributes, normalized resolved address, tracked resource and deletion by owned CE breakpoint ID.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_BreakpointLifecycle_TracksThenReleasesTheKnownOwnedBreakpoint"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_detach",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Debugger.DebuggerToolsTests.Detach_JobCompletedInLua_NoLongerBlocks",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Debugger/DebuggerToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.True(detached.Detached); Assert.Equal(TargetResourceState.Ended, Assert.Single(harness.Resources.List()).State);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Debugger.DebuggerToolsTests.Detach_JobCompletedInLua_NoLongerBlocks"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_get_context",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/status/context/register/thread/stack results and exact continuation/control arguments through inert CE APIs.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_get_stack_trace",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/status/context/register/thread/stack results and exact continuation/control arguments through inert CE APIs.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_get_status",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/status/context/register/thread/stack results and exact continuation/control arguments through inert CE APIs.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_list_breakpoints",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Debugger.PreparedBreakpointNavigationTests.ExplicitList_PreparesMaxCopyAndProjectsRequestedAndDefaultLimits",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Debugger/PreparedBreakpointNavigationTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((2, 3, true), (explicitPage.Breakpoints.Length, explicitPage.Total, explicitPage.Truncated));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Debugger.PreparedBreakpointNavigationTests.ExplicitList_PreparesMaxCopyAndProjectsRequestedAndDefaultLimits"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_poll_capture",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Debugger.DebuggerToolsTests.Capture_PollThenStop_RetainsTypedHitsAndReleasesTheLuaJob",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Debugger/DebuggerToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((\"401010\", 17L, \"1\"), (hit.Context.Ip, hit.Context.ThreadId, hit.Context.Registers[\"RAX\"])); Assert.Equal((started.JobId, JobState.Running, 1L, 1L, false, 0L), (...));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Debugger.DebuggerToolsTests.Capture_PollThenStop_RetainsTypedHitsAndReleasesTheLuaJob"
+ ]
+ },
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_CaptureTraceAndRunTo_CreateBoundedJobsWithKnownReceipts",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known target/address/TTL, capture hit at 401000, trace RAX=1, run-to continuation and ledger/job cleanup.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_CaptureTraceAndRunTo_CreateBoundedJobsWithKnownReceipts"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_poll_trace",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_CaptureTraceAndRunTo_CreateBoundedJobsWithKnownReceipts",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known target/address/TTL, capture hit at 401000, trace RAX=1, run-to continuation and ledger/job cleanup.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_CaptureTraceAndRunTo_CreateBoundedJobsWithKnownReceipts"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_run_to",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_CaptureTraceAndRunTo_CreateBoundedJobsWithKnownReceipts",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known target/address/TTL, capture hit at 401000, trace RAX=1, run-to continuation and ledger/job cleanup.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_CaptureTraceAndRunTo_CreateBoundedJobsWithKnownReceipts"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_set_breakpoint",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_BreakpointLifecycle_TracksThenReleasesTheKnownOwnedBreakpoint",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known breakpoint attributes, normalized resolved address, tracked resource and deletion by owned CE breakpoint ID.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_BreakpointLifecycle_TracksThenReleasesTheKnownOwnedBreakpoint"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_set_register",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/status/context/register/thread/stack results and exact continuation/control arguments through inert CE APIs.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_set_thread_ignored",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/status/context/register/thread/stack results and exact continuation/control arguments through inert CE APIs.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_start_capture",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_CaptureTraceAndRunTo_CreateBoundedJobsWithKnownReceipts",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known target/address/TTL, capture hit at 401000, trace RAX=1, run-to continuation and ledger/job cleanup.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_CaptureTraceAndRunTo_CreateBoundedJobsWithKnownReceipts"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_start_trace",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_CaptureTraceAndRunTo_CreateBoundedJobsWithKnownReceipts",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known target/address/TTL, capture hit at 401000, trace RAX=1, run-to continuation and ledger/job cleanup.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_CaptureTraceAndRunTo_CreateBoundedJobsWithKnownReceipts"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "debugger_step",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaDebuggerAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/status/context/register/thread/stack results and exact continuation/control arguments through inert CE APIs.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.DebuggerAdapter_AttachAndControlOperations_ForwardKnownArgumentsAndResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "dotnet_get_method_parameters",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetParameterAndObjectAdapters_MapKnownFieldsAndNormalizedInputs",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known parameter type-name conversion and object field value/offset, with normalized inputs.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetParameterAndObjectAdapters_MapKnownFieldsAndNormalizedInputs"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "dotnet_get_object",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetParameterAndObjectAdapters_MapKnownFieldsAndNormalizedInputs",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known parameter type-name conversion and object field value/offset, with normalized inputs.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetParameterAndObjectAdapters_MapKnownFieldsAndNormalizedInputs"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "dotnet_get_status",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetDiscoveryAdapters_MapStatusDomainsAndModulesWithRequestedPage",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/domain/module fields, totals and exact normalized page/handle arguments.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetDiscoveryAdapters_MapStatusDomainsAndModulesWithRequestedPage"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "dotnet_get_type",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetTypeAdapters_MapPagesDetailsAndMethodsWithFilters",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known type/base/field/method values and normalized handle, page and filter arguments.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetTypeAdapters_MapPagesDetailsAndMethodsWithFilters"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "dotnet_list_domains",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetDiscoveryAdapters_MapStatusDomainsAndModulesWithRequestedPage",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/domain/module fields, totals and exact normalized page/handle arguments.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetDiscoveryAdapters_MapStatusDomainsAndModulesWithRequestedPage"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "dotnet_list_methods",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetTypeAdapters_MapPagesDetailsAndMethodsWithFilters",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known type/base/field/method values and normalized handle, page and filter arguments.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetTypeAdapters_MapPagesDetailsAndMethodsWithFilters"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "dotnet_list_modules",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetDiscoveryAdapters_MapStatusDomainsAndModulesWithRequestedPage",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/domain/module fields, totals and exact normalized page/handle arguments.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetDiscoveryAdapters_MapStatusDomainsAndModulesWithRequestedPage"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "dotnet_list_types",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetTypeAdapters_MapPagesDetailsAndMethodsWithFilters",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known type/base/field/method values and normalized handle, page and filter arguments.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.DotNetTypeAdapters_MapPagesDetailsAndMethodsWithFilters"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "dotnet_poll_instance_search",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.DotNet.DotNetToolsTests.InstanceSearch_StartPollAndStop_RetainsTheBoundedResultThenDiscardsIt",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/DotNet/DotNetToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([new DotNetInstance(\"1000\"), new DotNetInstance(\"2000\")], page.Instances); Assert.Equal((1L, 2L, false, 0L), (...)); Assert.Equal((0, 0), (harness.Jobs.Count, harness.Resources.Count));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.DotNet.DotNetToolsTests.InstanceSearch_StartPollAndStop_RetainsTheBoundedResultThenDiscardsIt"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "dotnet_start_instance_search",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.DotNet.DotNetToolsTests.InstanceSearch_StartPollAndStop_RetainsTheBoundedResultThenDiscardsIt",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/DotNet/DotNetToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.StartsWith($\"dotnetinstances-{harness.Jobs.Namespace}-\", started.JobId, StringComparison.Ordinal); Assert.Equal((\"module\", \"token\", 2), (started.ModuleHandle, started.TypeToken, started.MaximumResults));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.DotNet.DotNetToolsTests.InstanceSearch_StartPollAndStop_RetainsTheBoundedResultThenDiscardsIt"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "exec_call_local",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ExecutionAdapter_CallLocal_EnablesTheFeatureAndForwardsTheKnownResult",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaExecutionAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Actual adapter through standalone Lua with inert CE API doubles: known result and forwarded arguments; file-backed cases also check held-file release.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ExecutionAdapter_CallLocal_EnablesTheFeatureAndForwardsTheKnownResult"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "exec_call_method",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ExecutionAdapter_CallMethod_ResolvesMethodAndInstanceBeforeCalling",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaExecutionAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Actual adapter through standalone Lua with inert CE API doubles: known result and forwarded arguments; file-backed cases also check held-file release.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ExecutionAdapter_CallMethod_ResolvesMethodAndInstanceBeforeCalling"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "exec_call_remote",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ExecutionAdapter_CallRemote_ResolvesTheFunctionAndForwardsTypedArguments",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaExecutionAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Actual adapter through standalone Lua with inert CE API doubles: known result and forwarded arguments; file-backed cases also check held-file release.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ExecutionAdapter_CallRemote_ResolvesTheFunctionAndForwardsTypedArguments"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "exec_compile_c",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ExecutionAdapter_CompileC_TargetSelfForwardsFlagsAndSortsTheKnownSymbols",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaExecutionAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Actual adapter through standalone Lua with inert CE API doubles: known result and forwarded arguments; file-backed cases also check held-file release.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ExecutionAdapter_CompileC_TargetSelfForwardsFlagsAndSortsTheKnownSymbols"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "exec_compile_csharp",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ExecutionAdapter_CompileCSharp_ExportsTheNativeCompilerArtifact",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaExecutionAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Actual adapter through standalone Lua with inert CE API doubles: known result and forwarded arguments; file-backed cases also check held-file release.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ExecutionAdapter_CompileCSharp_ExportsTheNativeCompilerArtifact"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "exec_inject_dotnet",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ExecutionAdapter_InjectDotNet_HoldsTheApprovedAssemblyAndForwardsEveryArgument",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaExecutionAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Actual adapter through standalone Lua with inert CE API doubles: known result and forwarded arguments; file-backed cases also check held-file release.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ExecutionAdapter_InjectDotNet_HoldsTheApprovedAssemblyAndForwardsEveryArgument"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "exec_inject_library",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ExecutionAdapter_InjectLibrary_HoldsTheApprovedArtifactAndForwardsTheWaitFlag",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaExecutionAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Actual adapter through standalone Lua with inert CE API doubles: known result and forwarded arguments; file-backed cases also check held-file release.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ExecutionAdapter_InjectLibrary_HoldsTheApprovedArtifactAndForwardsTheWaitFlag"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "kernel_get_status",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.KernelAdapter_GetStatus_EnablesKernelFeatureAndCopiesKnownState",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaExecutionAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Actual adapter through standalone Lua with inert CE API doubles: known result and forwarded arguments; file-backed cases also check held-file release.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.KernelAdapter_GetStatus_EnablesKernelFeatureAndCopiesKnownState"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "kernel_initialize_dbvm",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Kernel.KernelToolsTests.InitializeDbvm_PassesCheatEnginesWarningAndTheReasonSeparately",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Kernel/KernelToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new KernelDbvmInitialization(true, offload, \"Watch a page\"), result); Assert.Contains(\"Watch a page\", source);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Kernel.KernelToolsTests.InitializeDbvm_PassesCheatEnginesWarningAndTheReasonSeparately(offload: False)",
+ "CheatEngine.Mcp.Tests.Tools.Kernel.KernelToolsTests.InitializeDbvm_PassesCheatEnginesWarningAndTheReasonSeparately(offload: True)"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "kernel_poll_watch",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Kernel.KernelToolsTests.PollWatch_DrainsDbvmThenReadsThePageThroughTheJobPoll",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Kernel/KernelToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([1L, 2L], page.Events.Select(static item => item.SourceIndex)); Assert.Equal((\"401000\", \"1\", \"1AB000\"), (page.Events[0].Rip, page.Events[0].Rax, page.Events[0].Cr3));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Kernel.KernelToolsTests.PollWatch_DrainsDbvmThenReadsThePageThroughTheJobPoll"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "kernel_read_physical",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.KernelAdapter_ReadPhysical_EnablesKernelFeatureAndReturnsTheRequestedByteRange",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaExecutionAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Actual adapter through standalone Lua with inert CE API doubles: known result and forwarded arguments; file-backed cases also check held-file release.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.KernelAdapter_ReadPhysical_EnablesKernelFeatureAndReturnsTheRequestedByteRange"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "kernel_start_watch",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Kernel.KernelToolsTests.StartWatch_RangeThatEndsAtThePageBoundary_IsArmed",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Kernel/KernelToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((physicalAddress, byteSize), (started.PhysicalAddress, started.ByteSize));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Kernel.KernelToolsTests.StartWatch_RangeThatEndsAtThePageBoundary_IsArmed(physicalAddress: \"2000\", byteSize: 4096)",
+ "CheatEngine.Mcp.Tests.Tools.Kernel.KernelToolsTests.StartWatch_RangeThatEndsAtThePageBoundary_IsArmed(physicalAddress: \"2800\", byteSize: 2048)",
+ "CheatEngine.Mcp.Tests.Tools.Kernel.KernelToolsTests.StartWatch_RangeThatEndsAtThePageBoundary_IsArmed(physicalAddress: \"2FFF\", byteSize: 1)"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "kernel_translate_address",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.KernelAdapter_TranslateAddress_ResolvesTheVirtualAddressBeforeTheDbkCall",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaExecutionAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Actual adapter through standalone Lua with inert CE API doubles: known result and forwarded arguments; file-backed cases also check held-file release.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.KernelAdapter_TranslateAddress_ResolvesTheVirtualAddressBeforeTheDbkCall"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "kernel_write_physical",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.KernelAdapter_WritePhysical_EnablesKernelFeatureAndForwardsEachByte",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaExecutionAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Actual adapter through standalone Lua with inert CE API doubles: known result and forwarded arguments; file-backed cases also check held-file release.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.KernelAdapter_WritePhysical_EnablesKernelFeatureAndForwardsEachByte"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "lua_execute",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Lua.LuaToolQualificationTests.Execute_Success_UsesTheUnsafeAdapterAndKeepsCopiedValuesAndOpaqueCount",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Lua/LuaToolQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Unsafe adapter result values and opaque count",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Lua.LuaToolQualificationTests.Execute_Success_UsesTheUnsafeAdapterAndKeepsCopiedValuesAndOpaqueCount"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "lua_find_api",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Lua.LuaToolQualificationTests.FindApi_ForwardsExactPageArgumentsAndReturnsEveryKnownPageField",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Lua/LuaToolQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Exact query/page arguments and complete page result",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Lua.LuaToolQualificationTests.FindApi_ForwardsExactPageArgumentsAndReturnsEveryKnownPageField"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_allocate",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemoryAllocationToolsTests.Allocate_Executable_RequestsExecuteReadWriteAndTracksTheLease",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemoryAllocationToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((\"cave\", \"7FF000010000\", 64L, true), (info.Name, info.Address, info.Size, info.Executable));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryAllocationToolsTests.Allocate_Executable_RequestsExecuteReadWriteAndTracksTheLease"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_compare",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Compare_Differences_ListsRunsAndStopsAtTheLimit",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemoryReadToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([new MemoryDifference(\"1\", 2, \"02 03\", \"09 09\"), new MemoryDifference(\"6\", 1, \"07\", \"00\")], all.Differences);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Compare_Differences_ListsRunsAndStopsAtTheLimit"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_compare_snapshot",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemorySnapshotToolsTests.CompareSnapshot_TwoSnapshots_ListsChangedSlotsWithoutAnyDispatch",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemorySnapshotToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([new SnapshotChange(\"10004\", \"4\", \"0\", \"2\"), new SnapshotChange(\"1000C\", \"C\", \"0\", \"255\")], diff.Changes);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemorySnapshotToolsTests.CompareSnapshot_TwoSnapshots_ListsChangedSlotsWithoutAnyDispatch"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_copy",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemoryWriteToolsTests.Copy_Range_ReadsTheWholeSourceBeforeWritingTheDestination",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemoryWriteToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new MemoryCopyResult(\"1000\", \"2001\", 3), result);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryWriteToolsTests.Copy_Range_ReadsTheWholeSourceBeforeWritingTheDestination"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_create_snapshot",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemorySnapshotToolsTests.CreateSnapshot_ReadableRange_CopiesTheBytesAndDescribesTheTarget",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemorySnapshotToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(memory, store.Get(\"before\", \"name\").Image.Bytes);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemorySnapshotToolsTests.CreateSnapshot_ReadableRange_CopiesTheBytesAndDescribesTheTarget"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_delete_snapshot",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemorySnapshotToolsTests.DeleteSnapshot_FreesItsBytesAndAnUnknownNameIsNotFound",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemorySnapshotToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new MemorySnapshotDeleted(\"gone\", 16), deleted);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemorySnapshotToolsTests.DeleteSnapshot_FreesItsBytesAndAnUnknownNameIsNotFound"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_dump_to_file",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemoryFileToolsTests.DumpToFile_ReadableRange_WritesTheBytesAndLeavesNoTemporaryFile",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemoryFileToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(memory, File.ReadAllBytes(path));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryFileToolsTests.DumpToFile_ReadableRange_WritesTheBytesAndLeavesNoTemporaryFile"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_free",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemoryAllocationToolsTests.Free_RetryableRelease_KeepsTheAllocationTrackedUntilAReleaseCompletes",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemoryAllocationToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(ResourceReleaseKind.Released, released.Release.Kind); Assert.Empty(harness.Resources.List());",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryAllocationToolsTests.Free_RetryableRelease_KeepsTheAllocationTrackedUntilAReleaseCompletes"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_get_address_info",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemoryInfoToolsTests.GetAddressInfo_ResolvedAndUnresolved_DescribesEachInOneDispatch",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemoryInfoToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((\"401010\", \"game.exe+1010\", \"game.exe\", \".text\", (bool?) false), (player.Address, player.Symbol, player.Module, player.Section, player.IsSystemModule));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryInfoToolsTests.GetAddressInfo_ResolvedAndUnresolved_DescribesEachInOneDispatch"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_hash",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Hash_ChunkedRange_MatchesTheManagedDigest",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemoryReadToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(Convert.ToHexStringLower(SHA256.HashData(memory)), sha256.Hash);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Hash_ChunkedRange_MatchesTheManagedDigest"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_list_regions",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemoryInfoToolsTests.ListRegions_Filters_KeepMatchingRegionsInAddressOrderAndPage",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemoryInfoToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([\"10000\", \"401000\", \"402000\", \"500000\"], all.Regions.Select(static region => region.Base));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryInfoToolsTests.ListRegions_Filters_KeepMatchingRegionsInAddressOrderAndPage"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_list_snapshots",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemorySnapshotToolsTests.ListSnapshots_OldestFirst_ReportsTheBytesWithoutAnyDispatch",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemorySnapshotToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([\"one\", \"two\"], list.Snapshots.Select(static snapshot => snapshot.Name));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemorySnapshotToolsTests.ListSnapshots_OldestFirst_ReportsTheBytesWithoutAnyDispatch"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_load_from_file",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemoryFileToolsTests.LoadFromFile_FileLargerThanOneChunk_WritesContiguousBoundedBlocks",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemoryFileToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new FileLoadResult(path, \"1000\", input.Length), result);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryFileToolsTests.LoadFromFile_FileLargerThanOneChunk_WritesContiguousBoundedBlocks"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_read",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Read_FixedType_RoutesToTheTypedPrimitiveOfItsWidth",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemoryReadToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new MemoryReadResult(\"401010\", type, expected), result);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Read_FixedType_RoutesToTheTypedPrimitiveOfItsWidth(type: Double, expected: \"-0.25\")",
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Read_FixedType_RoutesToTheTypedPrimitiveOfItsWidth(type: Float, expected: \"1.5\")",
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Read_FixedType_RoutesToTheTypedPrimitiveOfItsWidth(type: Int16, expected: \"-300\")",
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Read_FixedType_RoutesToTheTypedPrimitiveOfItsWidth(type: Int32, expected: \"1337\")",
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Read_FixedType_RoutesToTheTypedPrimitiveOfItsWidth(type: Int64, expected: \"-9000000000\")",
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Read_FixedType_RoutesToTheTypedPrimitiveOfItsWidth(type: Int8, expected: \"-5\")",
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Read_FixedType_RoutesToTheTypedPrimitiveOfItsWidth(type: Pointer, expected: \"7FF6A1B2C3D0\")",
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Read_FixedType_RoutesToTheTypedPrimitiveOfItsWidth(type: UInt16, expected: \"60000\")",
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Read_FixedType_RoutesToTheTypedPrimitiveOfItsWidth(type: UInt32, expected: \"4000000000\")",
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Read_FixedType_RoutesToTheTypedPrimitiveOfItsWidth(type: UInt64, expected: \"18000000000000000000\")",
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.Read_FixedType_RoutesToTheTypedPrimitiveOfItsWidth(type: UInt8, expected: \"200\")"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_read_batch",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.ReadBatch_MixedItems_ReadsEachFixedTypeInOneTypedBatchAndKeepsOrder",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemoryReadToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([\"1\", \"0.5\", \"90 C3\", \"2\", null], result.Items.Select(static item => item.Value));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryReadToolsTests.ReadBatch_MixedItems_ReadsEachFixedTypeInOneTypedBatchAndKeepsOrder"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_read_samples",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemorySampleToolsTests.ReadSamples_ValueChanges_KeepTheFirstValueAndEveryChangeWithItsTime",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemorySampleToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([new MemorySamplePoint(0, \"5\"), new MemorySamplePoint(200, \"6\"), new MemorySamplePoint(400, \"5\")], first.Changes);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemorySampleToolsTests.ReadSamples_ValueChanges_KeepTheFirstValueAndEveryChangeWithItsTime"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_set_protection",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemoryWriteToolsTests.SetProtection_FixedScript_ReportsPreviousAndCurrentAccess",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemoryWriteToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new ProtectionChange(\"401000\", 4096, new ProtectionFlags(true, false, true), new ProtectionFlags(true, true, true)), change);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryWriteToolsTests.SetProtection_FixedScript_ReportsPreviousAndCurrentAccess"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_write",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemoryWriteToolsTests.Write_Int32_PreReadsPreviousWritesTypedAndVerifiesTheReadBack",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemoryWriteToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new MemoryWriteResult(\"1000\", 4, \"64 00 00 00\", true), result);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryWriteToolsTests.Write_Int32_PreReadsPreviousWritesTypedAndVerifiesTheReadBack"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "memory_write_batch",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Memory.MemoryWriteToolsTests.WriteBatch_ConsecutiveTypes_WriteInRequestOrderAndVerify",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Memory/MemoryWriteToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((5, false), (result.Written, result.Verified)); Assert.Equal([2], result.Mismatched!);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Memory.MemoryWriteToolsTests.WriteBatch_ConsecutiveTypes_WriteInRequestOrderAndVerify"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "module_find_patches",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Modules.ModulePatchToolTests.FindPatches_HookedCode_ReportsTheRangesAfterApplyingRelocations",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Modules/ModulePatchToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new ModulePatch(\"7FFA00004040\", \".text\", 5, \"91 92 93 94 95\", \"E9 11 22 33 44\", \"sample.Alpha+30\"), patch);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Modules.ModulePatchToolTests.FindPatches_HookedCode_ReportsTheRangesAfterApplyingRelocations"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "module_get",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Modules.ModuleToolTests.Get_Module_ReportsSectionsWithTheirFlagsThePeFieldsAndThePdb",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Modules/ModuleToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(\"game.exe\", result.Name);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Modules.ModuleToolTests.Get_Module_ReportsSectionsWithTheirFlagsThePeFieldsAndThePdb"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "module_list",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Modules.ModuleToolTests.List_AttachedProcess_PagesTheFilteredModulesInBothFormats",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Modules/ModuleToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(2, result.Total);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Modules.ModuleToolTests.List_AttachedProcess_PagesTheFilteredModulesInBothFormats"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "module_list_exports",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Modules.ModuleToolTests.ListExports_Module_PagesExportsByOrdinalWithForwarders",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Modules/ModuleToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(2, result.Total);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Modules.ModuleToolTests.ListExports_Module_PagesExportsByOrdinalWithForwarders"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "module_list_imports",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Modules.ModuleImportToolTests.ListImports_Module_ListsEverySlotWithItsValueAndTarget",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Modules/ModuleImportToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((\"sample.dll\", 6, (int?) null), (list.Module, list.Total, list.NextOffset)); Assert.Equal(expected, list.Imports); Assert.Equal(1, target.Dispatcher.Calls);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Modules.ModuleImportToolTests.ListImports_Module_ListsEverySlotWithItsValueAndTarget"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_attach",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoGatedMutationAdapters_DeclareTheGateMapResultsAndReleaseAttachment",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/JIT/invocation values, exact arguments and detach/resource cleanup.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoGatedMutationAdapters_DeclareTheGateMapResultsAndReleaseAttachment"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_compile_method",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoGatedMutationAdapters_DeclareTheGateMapResultsAndReleaseAttachment",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/JIT/invocation values, exact arguments and detach/resource cleanup.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoGatedMutationAdapters_DeclareTheGateMapResultsAndReleaseAttachment"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_detach",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Mono.MonoToolsTests.AttachThenDetach_ReleasesTheActivationOwnedCollectorResource",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Mono/MonoToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(TargetResourceState.Ended, Assert.Single(harness.Resources.List()).State);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Mono.MonoToolsTests.AttachThenDetach_ReleasesTheActivationOwnedCollectorResource"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_find_class",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoLookupAdapters_MapClassMethodAndStaticAddressWithExactHandles",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known class/method/static address and exact normalized lookup handles/names.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoLookupAdapters_MapClassMethodAndStaticAddressWithExactHandles"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_find_method",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoLookupAdapters_MapClassMethodAndStaticAddressWithExactHandles",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known class/method/static address and exact normalized lookup handles/names.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoLookupAdapters_MapClassMethodAndStaticAddressWithExactHandles"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_get_object",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Mono.MonoToolsTests.GetObject_TrimmedAddressAndBounds_ReachTheObjectBodyInOneDispatch",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Mono/MonoToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(expected, result); Assert.Equal(1, harness.Dispatches);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Mono.MonoToolsTests.GetObject_TrimmedAddressAndBounds_ReachTheObjectBodyInOneDispatch(maxBacktrack: 0, maximumFields: 1)",
+ "CheatEngine.Mcp.Tests.Tools.Mono.MonoToolsTests.GetObject_TrimmedAddressAndBounds_ReachTheObjectBodyInOneDispatch(maxBacktrack: 65536, maximumFields: 2048)"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_get_static_field_address",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoLookupAdapters_MapClassMethodAndStaticAddressWithExactHandles",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known class/method/static address and exact normalized lookup handles/names.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoLookupAdapters_MapClassMethodAndStaticAddressWithExactHandles"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_get_status",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoDiscoveryAdapters_MapStatusAndPagedCollectorResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known collector version, assembly/image/class/field/method values, totals and exact page/filter arguments.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoDiscoveryAdapters_MapStatusAndPagedCollectorResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_invoke_method",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoGatedMutationAdapters_DeclareTheGateMapResultsAndReleaseAttachment",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known attachment/JIT/invocation values, exact arguments and detach/resource cleanup.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoGatedMutationAdapters_DeclareTheGateMapResultsAndReleaseAttachment"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_list_assemblies",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoDiscoveryAdapters_MapStatusAndPagedCollectorResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known collector version, assembly/image/class/field/method values, totals and exact page/filter arguments.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoDiscoveryAdapters_MapStatusAndPagedCollectorResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_list_classes",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoDiscoveryAdapters_MapStatusAndPagedCollectorResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known collector version, assembly/image/class/field/method values, totals and exact page/filter arguments.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoDiscoveryAdapters_MapStatusAndPagedCollectorResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_list_fields",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoDiscoveryAdapters_MapStatusAndPagedCollectorResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known collector version, assembly/image/class/field/method values, totals and exact page/filter arguments.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoDiscoveryAdapters_MapStatusAndPagedCollectorResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_list_methods",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoDiscoveryAdapters_MapStatusAndPagedCollectorResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/ManagedAdapterQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Known collector version, assembly/image/class/field/method values, totals and exact page/filter arguments.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.ManagedAdapterQualificationTests.MonoDiscoveryAdapters_MapStatusAndPagedCollectorResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_poll_instance_search",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Mono.MonoToolsTests.InstanceSearch_StartPollAndStop_RetainsTheBoundedResultThenDiscardsIt",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Mono/MonoToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([new MonoInstance(\"3000\"), new MonoInstance(\"4000\")], page.Instances); Assert.Equal((0, 0), (harness.Jobs.Count, harness.Resources.Count));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Mono.MonoToolsTests.InstanceSearch_StartPollAndStop_RetainsTheBoundedResultThenDiscardsIt"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "mono_start_instance_search",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Mono.MonoToolsTests.InstanceSearch_StartPollAndStop_RetainsTheBoundedResultThenDiscardsIt",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Mono/MonoToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.StartsWith($\"monoinstances-{harness.Jobs.Namespace}-\", started.JobId, StringComparison.Ordinal); Assert.Equal((\"class\", 2), (started.ClassHandle, started.MaximumResults));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Mono.MonoToolsTests.InstanceSearch_StartPollAndStop_RetainsTheBoundedResultThenDiscardsIt"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_create_map",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.CreateMapThenFindPaths_Jobs_StoreRankedModuleRootedPaths",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerJobToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((PointerJobState.Ready, PointerFixture.ProcessId, 8, 3, false, 100), (map.State, map.ProcessId, map.PointerSize, map.Pointers, map.Incomplete, map.ProgressPercent));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.CreateMapThenFindPaths_Jobs_StoreRankedModuleRootedPaths"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_delete_map",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.DeleteMap_RunningCapture_StopsItsJobAndForgetsTheMap",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerJobToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new PointerDeleteResult(\"map\", true), deleted); Assert.Empty(fixture.Maps.ListMaps().Maps);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.DeleteMap_RunningCapture_StopsItsJobAndForgetsTheMap"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_delete_scan",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.DeleteScanAndMap_EndedJobs_AreNotCancelledAndFreeTheStore",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerJobToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new PointerDeleteResult(\"hp\", false), fixture.Scans.DeleteScan(\"hp\", Token)); Assert.Empty(fixture.Scans.ListScans().Scans);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.DeleteScanAndMap_EndedJobs_AreNotCancelledAndFreeTheStore"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_find_paths",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.CreateMapThenFindPaths_Jobs_StoreRankedModuleRootedPaths",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerJobToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((PointerJobState.Ready, 2, false, false, \"21020\"), (searched.State, searched.Count, searched.Incomplete, searched.TraversalLimited, searched.Target));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.CreateMapThenFindPaths_Jobs_StoreRankedModuleRootedPaths"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_find_references",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerReferenceToolTests.FindReferences_LiveExact_ScansTheAlignedLittleEndianPointerInWritableMemory",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerReferenceToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new PointerReference(\"10100\", \"20000\", \"0\", \"game.exe+100\"), reference);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerReferenceToolTests.FindReferences_LiveExact_ScansTheAlignedLittleEndianPointerInWritableMemory"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_get_access_info",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.PointerAccess_PaddedHexFacts_NormalizesMapsAndObservedAddress",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaPointerAccessTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(PointerAccessStatus.Supported, result.Status); Assert.Equal(\"1010\", result.EffectiveAddress);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.PointerAccess_PaddedHexFacts_NormalizesMapsAndObservedAddress(instruction: \"mov eax,[game.exe+10]\")",
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.PointerAccess_PaddedHexFacts_NormalizesMapsAndObservedAddress(instruction: \"mov eax,[rax+10]\")"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_list_maps",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.ListTools_ThroughTheServer_ReturnStructuredMapsAndScans",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerJobToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((\"map\", \"ready\"), (map.GetProperty(\"mapName\").GetString(), map.GetProperty(\"state\").GetString()));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.ListTools_ThroughTheServer_ReturnStructuredMapsAndScans"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_list_paths",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.CreateMapThenFindPaths_Jobs_StoreRankedModuleRootedPaths",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerJobToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(\"[[\\\"game.exe\\\"+100]+10]+20\", best.Expression);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.CreateMapThenFindPaths_Jobs_StoreRankedModuleRootedPaths"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_list_scans",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.RescanPaths_UnreadableHop_KeepsThePathUnresolvedUnlessDropped",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerJobToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.True(fixture.Scans.ListScans().Scans.Single().Incomplete);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.RescanPaths_UnreadableHop_KeepsThePathUnresolvedUnlessDropped"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_load_map",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerFileToolTests.SaveAndLoadMap_UsesAllowedRootAndReportsUnknownImportCompleteness",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerFileToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new PointerEntry(0x1010, 0x2000), Assert.Single(map.Entries));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerFileToolTests.SaveAndLoadMap_UsesAllowedRootAndReportsUnknownImportCompleteness"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_load_scan",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerFileToolTests.SaveAndLoadScan_PreservesContextButInvalidatesOldMatches",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerFileToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([-0x20L, 0x40], restored.Offsets); Assert.Equal(PointerVerification.Unresolved, restored.Verification);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerFileToolTests.SaveAndLoadScan_PreservesContextButInvalidatesOldMatches"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_read_chain",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerChainToolTests.ReadChain_NegativeOffset_ReportsEveryHopAndTheFinalValueInOneDispatch",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerChainToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(\"21020\", result.Address); Assert.Equal(\"1234\", result.Value);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerChainToolTests.ReadChain_NegativeOffset_ReportsEveryHopAndTheFinalValueInOneDispatch"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_read_chains",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerBatchToolTests.ReadChains_X64SignedOffsetsAndComparison_ReportsStableCandidateOutcomes",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerBatchToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(2, result.Summary.Processed); Assert.Equal(1, result.Summary.Matches);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerBatchToolTests.ReadChains_X64SignedOffsetsAndComparison_ReportsStableCandidateOutcomes"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_rescan_paths",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.RescanPaths_NewMapAndLiveMemory_KeepOnlyPathsThatStillReachTheTarget",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerJobToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new PointerRescanResult(\"hp\", 1, 1, 0, 0, false), live);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerJobToolTests.RescanPaths_NewMapAndLiveMemory_KeepOnlyPathsThatStillReachTheTarget"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_save_map",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerFileToolTests.SaveAndLoadMap_UsesAllowedRootAndReportsUnknownImportCompleteness",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerFileToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(path, saved.FilePath); Assert.True(File.Exists(path));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerFileToolTests.SaveAndLoadMap_UsesAllowedRootAndReportsUnknownImportCompleteness"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "pointer_save_scan",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Pointer.PointerFileToolTests.SaveAndLoadScan_PreservesContextButInvalidatesOldMatches",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Pointer/PointerFileToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(\"MCP.pointer-scan.v2\", saved.Format);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Pointer.PointerFileToolTests.SaveAndLoadScan_PreservesContextButInvalidatesOldMatches"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "process_attach",
+ "cases": [
+ {
+ "suite": "portable",
+ "scope": "adapter",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.ProcessListCurrentAndAttach_ForwardTypedRequestsAndMapResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CoreAdapterQualificationTests.cs",
+ "oracle": "Known typed or fixed-Lua snapshots are asserted against the returned tool result; exact forwarded requests and operation order are also checked.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.ProcessListCurrentAndAttach_ForwardTypedRequestsAndMapResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "process_create",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ProcessV2_FixedEffects_ReturnObservedTypedHostState",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaRuntimeProcessScanV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(88, created.ProcessId); Assert.Equal(1L, ReadGlobal(\"created\"));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ProcessV2_FixedEffects_ReturnObservedTypedHostState"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "process_get_current",
+ "cases": [
+ {
+ "suite": "portable",
+ "scope": "adapter",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.ProcessListCurrentAndAttach_ForwardTypedRequestsAndMapResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CoreAdapterQualificationTests.cs",
+ "oracle": "Known typed or fixed-Lua snapshots are asserted against the returned tool result; exact forwarded requests and operation order are also checked.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.ProcessListCurrentAndAttach_ForwardTypedRequestsAndMapResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "process_list",
+ "cases": [
+ {
+ "suite": "portable",
+ "scope": "adapter",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.ProcessListCurrentAndAttach_ForwardTypedRequestsAndMapResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CoreAdapterQualificationTests.cs",
+ "oracle": "Known typed or fixed-Lua snapshots are asserted against the returned tool result; exact forwarded requests and operation order are also checked.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CoreAdapterQualificationTests.ProcessListCurrentAndAttach_ForwardTypedRequestsAndMapResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "process_list_threads",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ProcessV2_FixedEffects_ReturnObservedTypedHostState",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaRuntimeProcessScanV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new long[] { 100, 200, 300 }, threads.Threads);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ProcessV2_FixedEffects_ReturnObservedTypedHostState"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "process_open_file",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ProcessV2_FixedEffects_ReturnObservedTypedHostState",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaRuntimeProcessScanV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((99, 4096L, fileName, false), opened tuple);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ProcessV2_FixedEffects_ReturnObservedTypedHostState"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "process_save_file",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ProcessV2_FixedEffects_ReturnObservedTypedHostState",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaRuntimeProcessScanV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((true, fileName), saved tuple);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ProcessV2_FixedEffects_ReturnObservedTypedHostState"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "process_set_paused",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ProcessV2_Pause_IsRecordedBlocksATargetChangeAndIsResumedByTheRelease",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaProcessPauseTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.NotNull(paused.ResourceId); Assert.True(tools.Resources...);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ProcessV2_Pause_IsRecordedBlocksATargetChangeAndIsResumedByTheRelease"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "process_set_pointer_size",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ProcessV2_FixedEffects_ReturnObservedTypedHostState",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaRuntimeProcessScanV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(4, pointerSize.PointerSize);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ProcessV2_FixedEffects_ReturnObservedTypedHostState"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "record_clear",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Record.RecordClearToolsTests.Clear_NestedRecords_UsesTheBoundedWalkAndReturnsTheCompleteCount",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Record/RecordClearToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new RecordClearResult(5), result);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Record.RecordClearToolsTests.Clear_NestedRecords_UsesTheBoundedWalkAndReturnsTheCompleteCount"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "record_create",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.Create_ValueRecord_CreatesThroughFixedLuaAndWritesTheValueLast",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Record/RecordToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((1, \"Health\", \"game.exe+20\", \"100\"), (created.Id, created.Description, created.Address, created.Value));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.Create_ValueRecord_CreatesThroughFixedLuaAndWritesTheValueLast"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "record_delete",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.Delete_UsesTypedDeleteAfterItCopiesEveryRequestedRecord",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Record/RecordToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(2, result.Deleted);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.Delete_UsesTypedDeleteAfterItCopiesEveryRequestedRecord"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "record_find",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.ListAndFind_DescribeTheWholeListWithNestedRecords",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Record/RecordToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([6, 7], page.Records.Select(static record => record.Id).ToArray());",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.ListAndFind_DescribeTheWholeListWithNestedRecords"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "record_get",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.Get_IncludeDropdown_CopiesEveryDropdownInOneBoundedLuaPass",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Record/RecordToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([mode, linked], result.Records.Select(static record => record.Dropdown).ToArray());",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.Get_IncludeDropdown_CopiesEveryDropdownInOneBoundedLuaPass"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "record_get_selected",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.GetSelected_KnownRecord_MapsTheCurrentClientSnapshot",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Record/RecordToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Known selected snapshot and exact typed Client call",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.GetSelected_KnownRecord_MapsTheCurrentClientSnapshot"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "record_group",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.Group_ParentedMembers_PreservesRequestedOrderAndRecordsTheClientEffects",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Record/RecordToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Ordered members, exact group definition and parent requests",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.Group_ParentedMembers_PreservesRequestedOrderAndRecordsTheClientEffects"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "record_list",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.List_PagesTheWholeListThroughTheTypedTableClient",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Record/RecordToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(3, page.Total);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.List_PagesTheWholeListThroughTheTypedTableClient"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "record_move",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.Move_ParentAndRoot_ForwardTheExactParentRequestsAndReturnMappedRecords",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Record/RecordToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Parent/root requests and returned records",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.Move_ParentAndRoot_ForwardTheExactParentRequestsAndReturnMappedRecords"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "record_select",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.Select_KnownRecord_ForwardsItsIdAndReturnsTheMappedSnapshot",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Record/RecordToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Selected ID, mapped snapshot and exact Client request",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.Select_KnownRecord_ForwardsItsIdAndReturnsTheMappedSnapshot"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "record_set_active",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.SetActive_ParentThatReachesNoAutoAssemblerRecord_ChangesWithoutTheFeature",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Record/RecordToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new RecordActivation(5, true, true, false), Assert.Single(result.Records));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.SetActive_ParentThatReachesNoAutoAssemblerRecord_ChangesWithoutTheFeature"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "record_set_dropdown",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.SetDropdown_ReplacesTheListThroughFixedLuaAndReadsItBack",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Record/RecordToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((4, stored), (result.Record.Id, result.Record.Dropdown));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.SetDropdown_ReplacesTheListThroughFixedLuaAndReadsItBack"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "record_set_script",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.SetScript_AutoAssemblerRecord_UsesFixedLuaAndReadsBack",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Record/RecordToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(12, result.Record.Id);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.SetScript_AutoAssemblerRecord_UsesFixedLuaAndReadsBack"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "record_update",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.Update_AddressValueAndOffsets_AppliesAddressThenOffsetsThenValue",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Record/RecordToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((\"game.exe+100\", \"5\"), (result.Records[0].Address, result.Records[0].Value));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Record.RecordToolsTests.Update_AddressValueAndOffsets_AppliesAddressThenOffsetsThenValue"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "runtime_get_info",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Runtime.RuntimeToolsTests.GetInfo_ReportsEveryGateOfTheActivation",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Runtime/RuntimeToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(expected, info.Gates);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Runtime.RuntimeToolsTests.GetInfo_ReportsEveryGateOfTheActivation(autoAssembler: False, unsafeLua: False, targetCodeExecution: False, kernelAccess: False)",
+ "CheatEngine.Mcp.Tests.Tools.Runtime.RuntimeToolsTests.GetInfo_ReportsEveryGateOfTheActivation(autoAssembler: False, unsafeLua: True, targetCodeExecution: False, kernelAccess: True)",
+ "CheatEngine.Mcp.Tests.Tools.Runtime.RuntimeToolsTests.GetInfo_ReportsEveryGateOfTheActivation(autoAssembler: True, unsafeLua: False, targetCodeExecution: True, kernelAccess: False)",
+ "CheatEngine.Mcp.Tests.Tools.Runtime.RuntimeToolsTests.GetInfo_ReportsEveryGateOfTheActivation(autoAssembler: True, unsafeLua: True, targetCodeExecution: True, kernelAccess: True)"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "runtime_get_overview",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Runtime.RuntimeToolsTests.GetOverview_CarriesTheGatesInItsRuntimeSection",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Runtime/RuntimeToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(expected, overview.Runtime.Gates);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Runtime.RuntimeToolsTests.GetOverview_CarriesTheGatesInItsRuntimeSection"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "runtime_list_jobs",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.RuntimeProcessScanV2ContractTests.RuntimeReleaseResources_ReleasesTrackedStateAndRuntimeStopJobRoutesToRegistry",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/RuntimeProcessScanV2ContractTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Contains(tools.ListJobs(Token).Jobs, status => status.JobId == job.Id);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.RuntimeProcessScanV2ContractTests.RuntimeReleaseResources_ReleasesTrackedStateAndRuntimeStopJobRoutesToRegistry"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "runtime_list_resources",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.RuntimeProcessScanV2ContractTests.RuntimeReleaseResources_ReleasesTrackedStateAndRuntimeStopJobRoutesToRegistry",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/RuntimeProcessScanV2ContractTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Contains(listed.Resources, item => item.Id == resource.Descriptor.Id);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.RuntimeProcessScanV2ContractTests.RuntimeReleaseResources_ReleasesTrackedStateAndRuntimeStopJobRoutesToRegistry"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "runtime_release_resources",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.RuntimeProcessScanV2ContractTests.RuntimeReleaseResources_ReleasesTrackedStateAndRuntimeStopJobRoutesToRegistry",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/RuntimeProcessScanV2ContractTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.True(released.Release.IsComplete); Assert.Equal(1, resource.ReleaseCalls);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.RuntimeProcessScanV2ContractTests.RuntimeReleaseResources_ReleasesTrackedStateAndRuntimeStopJobRoutesToRegistry"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "runtime_stop_job",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.RuntimeProcessScanV2ContractTests.RuntimeReleaseResources_ReleasesTrackedStateAndRuntimeStopJobRoutesToRegistry",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/RuntimeProcessScanV2ContractTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.True(stopped.Released); Assert.DoesNotContain(tools.ListJobs(Token).Jobs, status => status.JobId == job.Id);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.RuntimeProcessScanV2ContractTests.RuntimeReleaseResources_ReleasesTrackedStateAndRuntimeStopJobRoutesToRegistry"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "scan_delete",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Scan.ScanToolsV2Tests.IndependentSessions_NarrowReadAndDelete_AffectOnlyTheNamedSession",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Scan/ScanToolsV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.True(deleted.Removed); Assert.Null(deleted.Status); Assert.Equal((1, 0, 1, 0), (alpha.NextCalls, beta.NextCalls, alpha.ReleaseCalls, beta.ReleaseCalls));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Scan.ScanToolsV2Tests.IndependentSessions_NarrowReadAndDelete_AffectOnlyTheNamedSession"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "scan_first",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerFirstReadResetAndStop_UseTypedBoundedResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaRuntimeProcessScanV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((\"main\", \"ui\", \"Scanning\"), (started.ScannerName, started.Mode, started.State));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerFirstReadResetAndStop_UseTypedBoundedResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "scan_get_status",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerFirstReadResetAndStop_UseTypedBoundedResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaRuntimeProcessScanV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(\"ResultsReady\", tools.GetStatus(...).State);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerFirstReadResetAndStop_UseTypedBoundedResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "scan_list_results",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerFirstReadResetAndStop_UseTypedBoundedResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaRuntimeProcessScanV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(3UL, page.Count); Assert.Equal(\"ABCD\", page.Results[0].Address);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerFirstReadResetAndStop_UseTypedBoundedResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "scan_list_scanners",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerStatus_ReportsTheScanSettingsOfTheUi",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaScanOptionsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(expected, tools.ListScanners(Token).Scanners);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerStatus_ReportsTheScanSettingsOfTheUi"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "scan_next",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerComparison_UsesTheExpectedNativeControlIndex",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaRuntimeProcessScanV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(\"Scanning\", status.State); Assert.Equal(expectedIndex, ReadGlobal(\"requestedComparison\"));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerComparison_UsesTheExpectedNativeControlIndex(first: False, comparison: \"between\", value: \"10\", upperValue: \"20\", expectedIndex: 3)",
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerComparison_UsesTheExpectedNativeControlIndex(first: False, comparison: \"changed\", value: null, upperValue: null, expectedIndex: 8)",
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerComparison_UsesTheExpectedNativeControlIndex(first: False, comparison: \"decreased\", value: null, upperValue: null, expectedIndex: 6)",
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerComparison_UsesTheExpectedNativeControlIndex(first: False, comparison: \"decreasedBy\", value: \"10\", upperValue: null, expectedIndex: 7)",
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerComparison_UsesTheExpectedNativeControlIndex(first: False, comparison: \"exact\", value: \"10\", upperValue: null, expectedIndex: 0)",
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerComparison_UsesTheExpectedNativeControlIndex(first: False, comparison: \"greater\", value: \"10\", upperValue: null, expectedIndex: 1)",
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerComparison_UsesTheExpectedNativeControlIndex(first: False, comparison: \"increased\", value: null, upperValue: null, expectedIndex: 4)",
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerComparison_UsesTheExpectedNativeControlIndex(first: False, comparison: \"increasedBy\", value: \"10\", upperValue: null, expectedIndex: 5)",
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerComparison_UsesTheExpectedNativeControlIndex(first: False, comparison: \"less\", value: \"10\", upperValue: null, expectedIndex: 2)",
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerComparison_UsesTheExpectedNativeControlIndex(first: False, comparison: \"unchanged\", value: null, upperValue: null, expectedIndex: 9)"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "scan_reset",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerFirstReadResetAndStop_UseTypedBoundedResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaRuntimeProcessScanV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(\"Created\", tools.Reset(...).Status!.State);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerFirstReadResetAndStop_UseTypedBoundedResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "scan_stop",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerFirstReadResetAndStop_UseTypedBoundedResults",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaRuntimeProcessScanV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.True(stopped.StopRequested);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ScanV2_MainScannerFirstReadResetAndStop_UseTypedBoundedResults"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "speedhack_get_state",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.SpeedhackV2_SetSpeedOne_AtNormalSpeed_ChangesNothingAndNeverHooks",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaSpeedhackToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(expectedState, tools.GetState(Token));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.SpeedhackV2_SetSpeedOne_AtNormalSpeed_ChangesNothingAndNeverHooks(symbolBefore: False)",
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.SpeedhackV2_SetSpeedOne_AtNormalSpeed_ChangesNothingAndNeverHooks(symbolBefore: True)"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "speedhack_set_speed",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.SpeedhackV2_SetSpeedOne_WhileTheTargetIsSpedUp_RestoresWithoutActivating",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaSpeedhackToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(expected, result);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.SpeedhackV2_SetSpeedOne_WhileTheTargetIsSpedUp_RestoresWithoutActivating(stubs: \"configuredSpeed = 1; wantedSpeed = 2.5\")",
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.SpeedhackV2_SetSpeedOne_WhileTheTargetIsSpedUp_RestoresWithoutActivating(stubs: \"configuredSpeed = 2.5; wantedSpeed = 2.5\")"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_add_elements",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.StructureAddElements_NewOffsets_ReportTheSortedIndicesAndRollBackARefusal",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaStructureTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([4, 1], change.Indices);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.StructureAddElements_NewOffsets_ReportTheSortedIndicesAndRollBackARefusal"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_autoguess",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.Autoguess_Address_IsResolvedByTheClientAndReadFromTheOffset",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Structures/StructureToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(40, summary.ElementCount);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.Autoguess_Address_IsResolvedByTheClientAndReadFromTheOffset"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_compare",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.Compare_AlongAStructure_UsesItsElementsNamesAndTypes",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Structures/StructureToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(\"flags\", Assert.Single(result.Rows).Name);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.Compare_AlongAStructure_UsesItsElementsNamesAndTypes"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_create",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.Create_Elements_AreEncodedAsVartypeDisplayAndByteSize",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Structures/StructureToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(2, result.ElementCount);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.Create_Elements_AreEncodedAsVartypeDisplayAndByteSize"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_delete",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.StructureDelete_KnownThenAgain_DestroysOnceThenIsNotFound",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaStructureTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new StructureDeleted(\"Enemy\"), tools.Delete(\"Enemy\", StructureToken));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.StructureDelete_KnownThenAgain_DestroysOnceThenIsNotFound"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_fill_from_dotnet",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.StructureFillFromDotNet_HaltedMissingOrFound_FollowsTheCollector",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaStructureTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new StructureSummary(\"Game.Player\", 8, 1), filled);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.StructureFillFromDotNet_HaltedMissingOrFound_FollowsTheCollector"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_generate_c_header",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Structures.StructureHeaderToolsTests.GenerateCHeader_CheatEngineText_IsReturnedWithEveryDeclaredStructure",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Structures/StructureHeaderToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Contains(\"struct Player\", result.Text, StringComparison.Ordinal);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Structures.StructureHeaderToolsTests.GenerateCHeader_CheatEngineText_IsReturnedWithEveryDeclaredStructure"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_get",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.Get_CheatEngineElementFields_MapToContractTypesAndOffsets",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Structures/StructureToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(\"health\", result.Elements[0].Name);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.Get_CheatEngineElementFields_MapToContractTypesAndOffsets"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_get_pdb_layout",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.GetPdbLayout_Fields_MapOffsetsAndReportedTypes",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Structures/StructureToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((\"4\", \"int32\"), (result.Fields[0].Offset, result.Fields[0].ValueType));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.GetPdbLayout_Fields_MapOffsetsAndReportedTypes"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_list",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.List_Filter_ReachesTheScriptAsArgumentsAndItsPageIsReturned",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Structures/StructureToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(\"Player\", Assert.Single(result.Structures).Name);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.List_Filter_ReachesTheScriptAsArgumentsAndItsPageIsReturned"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_read",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.Read_TwoAddresses_DecodesEveryElementAndNullsWhatIsUnreadable",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Structures/StructureToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([\"7\", \"8\"], result.Elements[0].Values);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.Read_TwoAddresses_DecodesEveryElementAndNullsWhatIsUnreadable"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_remove_elements",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.StructureRemoveElements_Indices_RemoveHighestFirstAndRefuseOutOfRange",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaStructureTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([2, 0], change.Indices);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.StructureRemoveElements_Indices_RemoveHighestFirstAndRefuseOutOfRange"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_set_name",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.StructureSetName_StubbedStructures_RenamesInPlaceAndRefusesTakenOrMissingNames",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaStructureTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new StructureSummary(\"Hero\", 32, 4), renamed);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.StructureSetName_StubbedStructures_RenamesInPlaceAndRefusesTakenOrMissingNames"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_update_elements",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.UpdateElements_DisplayWithoutType_IsCheckedByTheScriptAgainstTheCurrentType",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Structures/StructureToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "The fixed-Lua request encodes hexadecimal flags and the dtHexadecimal type; returned change indices equal [1].",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.UpdateElements_DisplayWithoutType_IsCheckedByTheScriptAgainstTheCurrentType"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "structure_write_element",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.WriteElement_Int32_WritesTheEncodedBytesAtTheElementAndReadsThemBack",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Structures/StructureToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(\"9\", result.Value);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Structures.StructureToolsTests.WriteElement_Int32_WritesTheEncodedBytesAtTheElementAndReadsThemBack"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "symbol_add_module",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolToolTests.AddModule_LocalFile_LoadsTheNormalizedPathAtTheResolvedBase",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Symbol/SymbolToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new SymbolModuleLoad(pdb, \"140000000\", true), load); Assert.Equal(1, target.Dispatcher.Calls);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolToolTests.AddModule_LocalFile_LoadsTheNormalizedPathAtTheResolvedBase"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "symbol_enable_sources",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolToolTests.EnableSources_Windows_ReportsExternalAccessAndUsesOnlyFixedLuaArguments",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Symbol/SymbolToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Known Windows enabled/kernel disabled/external access result and exact boolean fixed-Lua arguments.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolToolTests.EnableSources_Windows_ReportsExternalAccessAndUsesOnlyFixedLuaArguments"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "symbol_find",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolFindToolTests.Find_WithoutModule_ChecksTheProcessAndPassesTheTextOnlyAsAnArgument",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Symbol/SymbolFindToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(\"playerHealth\", Assert.Single(result.Symbols).Name);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolFindToolTests.Find_WithoutModule_ChecksTheProcessAndPassesTheTextOnlyAsAnArgument"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "symbol_get_module_preference",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ModuleSymbolGetModulePreference_Stubbed_CopiesAtMost1024NamesAndRefusesAMissingHostList",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaModuleSymbolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([\"game\", \"engine\", \"kernel32\"], current.Modules);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ModuleSymbolGetModulePreference_Stubbed_CopiesAtMost1024NamesAndRefusesAMissingHostList"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "symbol_list_registered",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ModuleSymbolListRegistered_Stubbed_CopiesEveryFieldIntoTheRecord",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaModuleSymbolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new RegisteredSymbolEntry(\"playerBase\", false, \"140000010\"), list.Symbols[0]);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ModuleSymbolListRegistered_Stubbed_CopiesEveryFieldIntoTheRecord"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "symbol_register",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolRegistrationToolTests.Register_Symbol_IsAnOwnedLeaseTrackedAsASymbolResource",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Symbol/SymbolRegistrationToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((\"playerBase\", \"400010\", false), (symbol.Name, symbol.Address, symbol.DoNotSave));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolRegistrationToolTests.Register_Symbol_IsAnOwnedLeaseTrackedAsASymbolResource"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "symbol_reload",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolToolTests.Reload_Scope_StartsTheReloadAndReportsDone",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Symbol/SymbolToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal((scope, true), (result.Scope, result.Done));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolToolTests.Reload_Scope_StartsTheReloadAndReportsDone(scope: All, module: null, arguments: \"[1] = \\\"all\\\", [2] = nil\")",
+ "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolToolTests.Reload_Scope_StartsTheReloadAndReportsDone(scope: Dotnet, module: \"Assembly-CSharp.dll\", arguments: \"[1] = \\\"dotnet\\\", [2] = \\\"Assembly-CSharp.dll\\\"\")",
+ "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolToolTests.Reload_Scope_StartsTheReloadAndReportsDone(scope: NewModules, module: null, arguments: \"[1] = \\\"new_modules\\\", [2] = nil\")"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "symbol_resolve",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolToolTests.Resolve_Expressions_ResolveInBandWithNamesSymbolsAndPerItemErrors",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Symbol/SymbolToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(\"401010\", result.Items[0].Address);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolToolTests.Resolve_Expressions_ResolveInBandWithNamesSymbolsAndPerItemErrors"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "symbol_set_module_preference",
+ "cases": [
+ {
+ "suite": "nativeLua",
+ "testMethod": "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ModuleSymbolSetModulePreference_Stubbed_MovesModulesFirstOrReplacesAndReadsBack",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/NativeLua/NativeLuaModuleSymbolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal([\"solo\"], replaced.Modules);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.NativeLua.NativeLuaToolRuntimeTests.ModuleSymbolSetModulePreference_Stubbed_MovesModulesFirstOrReplacesAndReadsBack"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "symbol_unregister",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolRegistrationToolTests.Unregister_OwnedSymbol_ReleasesItsLeaseAndForgetsIt",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Symbol/SymbolRegistrationToolTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.True(result.Release.IsComplete);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Symbol.SymbolRegistrationToolTests.Unregister_OwnedSymbol_ReleasesItsLeaseAndForgetsIt"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "table_list_files",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.ListFiles_AllowedRoots_ReturnsOnlyTablesAndSkipsNestedJunctions",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CodeAsmTableV2Tests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(2, result.Total); Assert.Equal([\"first.ct\", \"second.XML\"], names);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CodeAsmTableV2Tests.ListFiles_AllowedRoots_ReturnsOnlyTablesAndSkipsNestedJunctions"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "table_load",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CodeTableQualificationTests.TableLoad_InspectedDataTable_ForwardsPinnedTrustedFileAndMerge",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CodeTableQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "One inspected XML record without executable content, trusted file/merge forwarding, one Client load, unchanged source.",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CodeTableQualificationTests.TableLoad_InspectedDataTable_ForwardsPinnedTrustedFileAndMerge(merge: False)",
+ "CheatEngine.Mcp.Tests.Tools.CodeTableQualificationTests.TableLoad_InspectedDataTable_ForwardsPinnedTrustedFileAndMerge(merge: True)"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "table_save",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CodeTableQualificationTests.TableSave_AllowedDestination_ForwardsTheTrustedPathAndReportsTheCreatedFile",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CodeTableQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(new TableSaveResult(destination, false), result); Assert.Equal(\"\", File.ReadAllText(destination));",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CodeTableQualificationTests.TableSave_AllowedDestination_ForwardsTheTrustedPathAndReportsTheCreatedFile"
+ ]
+ },
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.CodeTableQualificationTests.TableSave_AllowedDestination_ForwardsTheTrustedPathAndReportsTheCreatedFile",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/CodeTableQualificationTests.cs",
+ "scope": "adapter",
+ "oracle": "Trusted destination and independently created file",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.CodeTableQualificationTests.TableSave_AllowedDestination_ForwardsTheTrustedPathAndReportsTheCreatedFile"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "util_calculate",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Util.UtilToolsTests.Calculate_UsesUnsigned64BitWraparound",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Util/UtilToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(unsignedValue, result.UnsignedValue); Assert.Equal(signedValue, result.SignedValue);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Util.UtilToolsTests.Calculate_UsesUnsigned64BitWraparound(expression: \"(1 << 63) + (1 << 63)\", unsignedValue: \"0\", signedValue: \"0\", hex: \"0\")",
+ "CheatEngine.Mcp.Tests.Tools.Util.UtilToolsTests.Calculate_UsesUnsigned64BitWraparound(expression: \"~0\", unsignedValue: \"18446744073709551615\", signedValue: \"-1\", hex: \"FFFFFFFFFFFFFFFF\")",
+ "CheatEngine.Mcp.Tests.Tools.Util.UtilToolsTests.Calculate_UsesUnsigned64BitWraparound(expression: \"0x8000000000000000 >> 1\", unsignedValue: \"4611686018427387904\", signedValue: \"4611686018427387904\", hex: \"4000000000000000\")",
+ "CheatEngine.Mcp.Tests.Tools.Util.UtilToolsTests.Calculate_UsesUnsigned64BitWraparound(expression: \"0xFFFFFFFFFFFFFFFF + 2\", unsignedValue: \"1\", signedValue: \"1\", hex: \"1\")"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ },
+ {
+ "name": "util_convert_value",
+ "cases": [
+ {
+ "suite": "portable",
+ "testMethod": "CheatEngine.Mcp.Tests.Tools.Util.UtilToolsTests.ConvertValue_Scalar_UsesTheRequestedByteOrderAndTargetInterpretation",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/Tools/Util/UtilToolsTests.cs",
+ "scope": "adapter",
+ "oracle": "Assert.Equal(expected, result.Value);",
+ "requiredCases": [
+ "CheatEngine.Mcp.Tests.Tools.Util.UtilToolsTests.ConvertValue_Scalar_UsesTheRequestedByteOrderAndTargetInterpretation"
+ ]
+ }
+ ],
+ "remaining": "Native success, side effects and cleanup on the exact product bundle remain unverified."
+ }
+ ]
+}
diff --git a/docs/qualification/all-tools/live-evidence.json b/docs/qualification/all-tools/live-evidence.json
new file mode 100644
index 0000000..ef6b932
--- /dev/null
+++ b/docs/qualification/all-tools/live-evidence.json
@@ -0,0 +1,339 @@
+{
+ "schema": "cheatengine-mcp-live-evidence/v1",
+ "boundary": "Reviewed live positive evidence only. A row is verified only when its receipt, any required cleanup receipt, and a fully passed/restored live summary are present.",
+ "tools": [
+ {
+ "name": "runtime_get_info",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyGatesAsync",
+ "oracle": "gates unsafeLua, autoAssembler, targetCodeExecution, kernelAccess are all false",
+ "receipt": "live_workflow_gates",
+ "cleanupReceipt": "none",
+ "scope": "safe_gate"
+ },
+ {
+ "name": "memory_allocate",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyMemoryAsync",
+ "oracle": "source/destination size == 128 and source executable == false",
+ "receipt": "live_workflow_memory",
+ "cleanupReceipt": "live_workflow_memory_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "memory_write_batch",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyMemoryAsync",
+ "oracle": "written == 3; verified == true; mismatched == null",
+ "receipt": "live_workflow_memory",
+ "cleanupReceipt": "live_workflow_memory_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "memory_read",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyMemoryAsync",
+ "oracle": "InitialBatchValues and scalar round-trips assert exact values including endian/string/wide/64-bit",
+ "receipt": "live_workflow_memory",
+ "cleanupReceipt": "live_workflow_memory_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "memory_read_batch",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyMemoryAsync",
+ "oracle": "failed == 1; readable items equal 1 and MCP; unreadable item error == memory_read_failed",
+ "receipt": "live_workflow_memory",
+ "cleanupReceipt": "live_workflow_memory_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "memory_hash",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyMemoryAsync",
+ "oracle": "hash equals SHA256 of known 16-byte buffer",
+ "receipt": "live_workflow_memory",
+ "cleanupReceipt": "live_workflow_memory_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "memory_copy",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyMemoryAsync",
+ "oracle": "returned source and destination equal requested addresses; subsequent MemoryCompare reports equal with no differences for the known 16-byte buffer",
+ "receipt": "live_workflow_memory",
+ "cleanupReceipt": "live_workflow_memory_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "memory_compare",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyMemoryAsync",
+ "oracle": "equal == true; truncated == false; differences empty",
+ "receipt": "live_workflow_memory",
+ "cleanupReceipt": "live_workflow_memory_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "memory_create_snapshot",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyMemoryAsync",
+ "oracle": "unreadableBytes == 0 and unreadable empty",
+ "receipt": "live_workflow_memory",
+ "cleanupReceipt": "live_workflow_memory_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "memory_compare_snapshot",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyMemoryAsync",
+ "oracle": "compared/skipped/total == (4,0,1) and changed address equals destination",
+ "receipt": "live_workflow_memory",
+ "cleanupReceipt": "live_workflow_memory_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "memory_set_protection",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyMemoryAsync",
+ "oracle": "current read true, write false, execute false",
+ "receipt": "live_workflow_memory",
+ "cleanupReceipt": "live_workflow_memory_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "scan_get_status",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyScannerAsync",
+ "oracle": "main settings memPrivate is true",
+ "receipt": "live_workflow_scanner",
+ "cleanupReceipt": "live_workflow_scanner_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "scan_first",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyScannerAsync",
+ "oracle": "successful first scan is followed by AssertScan exact result",
+ "receipt": "live_workflow_scanner",
+ "cleanupReceipt": "live_workflow_scanner_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "scan_next",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyScannerAsync",
+ "oracle": "changed/increased/decreased transitions each followed by AssertScan exact address/value",
+ "receipt": "live_workflow_scanner",
+ "cleanupReceipt": "live_workflow_scanner_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "scan_list_results",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "AssertScanAsync",
+ "oracle": "single result address/value; hasMore false",
+ "receipt": "live_workflow_scanner",
+ "cleanupReceipt": "live_workflow_scanner_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "scan_reset",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyScannerAsync",
+ "oracle": "removed == false; subsequent ScanFirst succeeds on the reset scanner and returns exactly the expected address/value 25 for the range 20..30",
+ "receipt": "live_workflow_scanner",
+ "cleanupReceipt": "live_workflow_scanner_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "aob_find",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyAobAsync",
+ "oracle": "two exact patterns and AssertAob each match at address+16",
+ "receipt": "live_workflow_aob",
+ "cleanupReceipt": "live_workflow_aob_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "aob_find_value",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyAobAsync",
+ "oracle": "result pattern == 04 03 02 01 and AssertAob at address+32",
+ "receipt": "live_workflow_aob",
+ "cleanupReceipt": "live_workflow_aob_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "code_get_function_graph",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyControlFlowAsync",
+ "oracle": "entry/start/end, instructionCount 7, 3 blocks and terminators/successors asserted; truncation case asserted",
+ "receipt": "live_workflow_cfg",
+ "cleanupReceipt": "live_workflow_cfg_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "module_list",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyModulesAsync",
+ "oracle": "expected module found; base and size > 0; is64Bit matches sandbox",
+ "receipt": "live_workflow_modules",
+ "cleanupReceipt": "none",
+ "scope": "read_only_workflow"
+ },
+ {
+ "name": "module_get",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyModulesAsync",
+ "oracle": "base matches and sections include executable; PE machine matches architecture",
+ "receipt": "live_workflow_modules",
+ "cleanupReceipt": "none",
+ "scope": "read_only_workflow"
+ },
+ {
+ "name": "module_list_imports",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyModulesAsync",
+ "oracle": "total > 0 and each import dll nonblank",
+ "receipt": "live_workflow_modules",
+ "cleanupReceipt": "none",
+ "scope": "read_only_workflow"
+ },
+ {
+ "name": "symbol_resolve",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyModulesAsync",
+ "oracle": "two items; no errors; both address equal module base",
+ "receipt": "live_workflow_modules",
+ "cleanupReceipt": "none",
+ "scope": "read_only_workflow"
+ },
+ {
+ "name": "module_find_patches",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyModulesAsync",
+ "oracle": "module matches; comparedBytes > 0; unreadable == 0; truncated false",
+ "receipt": "live_workflow_modules",
+ "cleanupReceipt": "none",
+ "scope": "read_only_workflow"
+ },
+ {
+ "name": "structure_create",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyStructuresAsync",
+ "oracle": "elementCount == 2 and size >= 6",
+ "receipt": "live_workflow_structures",
+ "cleanupReceipt": "live_workflow_structures_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "structure_read",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyStructuresAsync",
+ "oracle": "health and flags rows equal HealthValues/FlagValues",
+ "receipt": "live_workflow_structures",
+ "cleanupReceipt": "live_workflow_structures_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "structure_compare",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyStructuresAsync",
+ "oracle": "row offset/name/classification == (4,flags,discriminator)",
+ "receipt": "live_workflow_structures",
+ "cleanupReceipt": "live_workflow_structures_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "structure_write_element",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyStructuresAsync",
+ "oracle": "returned value == 9 and subsequent memory_read == 9",
+ "receipt": "live_workflow_structures",
+ "cleanupReceipt": "live_workflow_structures_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "structure_generate_c_header",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveWorkflowQualification.cs",
+ "testMethod": "VerifyStructuresAsync",
+ "oracle": "generator managed; text contains structure name, int32_t health, uint16_t flags",
+ "receipt": "live_workflow_structures",
+ "cleanupReceipt": "live_workflow_structures_cleanup",
+ "scope": "reversible_workflow"
+ },
+ {
+ "name": "process_get_current",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveAdditionalReadQualification.cs",
+ "testMethod": "VerifyAsync",
+ "oracle": "isOpen true; PID equals owned HostA target; pointer size equals target architecture; selectionEpoch >= 0",
+ "receipt": "all_tools_process_get_current",
+ "cleanupReceipt": "none",
+ "scope": "read_only_workflow"
+ },
+ {
+ "name": "process_list",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveAdditionalReadQualification.cs",
+ "testMethod": "VerifyAsync",
+ "oracle": "target PID present; truncated false",
+ "receipt": "all_tools_process_list",
+ "cleanupReceipt": "none",
+ "scope": "read_only_workflow"
+ },
+ {
+ "name": "process_list_threads",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveAdditionalReadQualification.cs",
+ "testMethod": "VerifyAsync",
+ "oracle": "threads nonempty and every thread ID > 0; truncated false",
+ "receipt": "all_tools_process_list_threads",
+ "cleanupReceipt": "none",
+ "scope": "read_only_workflow"
+ },
+ {
+ "name": "process_set_pointer_size",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveAdditionalReadQualification.cs",
+ "testMethod": "VerifyAsync",
+ "oracle": "returned and subsequent current pointerSize equal captured width; PID and selection epoch are unchanged",
+ "receipt": "all_tools_process_set_pointer_size",
+ "cleanupReceipt": "none",
+ "scope": "read_only_workflow"
+ },
+ {
+ "name": "memory_get_address_info",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveAdditionalReadQualification.cs",
+ "testMethod": "VerifyAsync",
+ "oracle": "single item no error; committed/private region readable+writable; pointerValue present",
+ "receipt": "all_tools_memory_get_address_info",
+ "cleanupReceipt": "none",
+ "scope": "read_only_workflow"
+ },
+ {
+ "name": "memory_read_samples",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveAdditionalReadQualification.cs",
+ "testMethod": "VerifyAsync",
+ "oracle": "ticks > 0; one series; exact address, sample count, value 20260926, no errors/truncation",
+ "receipt": "all_tools_memory_read_samples",
+ "cleanupReceipt": "none",
+ "scope": "read_only_workflow"
+ },
+ {
+ "name": "lua_find_api",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveAdditionalReadQualification.cs",
+ "testMethod": "VerifyAsync",
+ "oracle": "total > 0; lines nonempty; every line contains getAddressSafe and positive line number",
+ "receipt": "all_tools_lua_find_api",
+ "cleanupReceipt": "none",
+ "scope": "read_only_workflow"
+ },
+ {
+ "name": "code_disassemble_bytes",
+ "sourceFile": "tests/CheatEngine.Mcp.Tests/LiveQualification/LiveAdditionalReadQualification.cs",
+ "testMethod": "VerifyAsync",
+ "oracle": "90 returns text containing nop; C3 returns text containing ret; origin 0",
+ "receipt": "all_tools_code_disassemble_bytes",
+ "cleanupReceipt": "none",
+ "scope": "read_only_workflow"
+ }
+ ]
+}
diff --git a/eng/Write-AllToolQualificationReport.ps1 b/eng/Write-AllToolQualificationReport.ps1
new file mode 100644
index 0000000..915f884
--- /dev/null
+++ b/eng/Write-AllToolQualificationReport.ps1
@@ -0,0 +1,269 @@
+#requires -Version 7.0
+<#
+.SYNOPSIS
+Writes one evidence row per advertised tool without treating routing or refusals as native qualification.
+#>
+[CmdletBinding()]
+param(
+ [Parameter(Mandatory)][string] $GatewayTrx,
+ [string] $PortableTrx,
+ [string] $NativeLuaTrx,
+ [string] $LiveSummary,
+ [string] $LiveEvidencePath = (Join-Path $PSScriptRoot '../docs/qualification/all-tools/live-evidence.json'),
+ [string] $OutputDirectory = (Join-Path $PSScriptRoot '../artifacts/all-tools/report')
+)
+$ErrorActionPreference = 'Stop'
+Set-StrictMode -Version Latest
+
+function Read-TestReport([string] $Path) {
+ $settings = [Xml.XmlReaderSettings]::new()
+ $settings.DtdProcessing = [Xml.DtdProcessing]::Prohibit
+ $settings.XmlResolver = $null
+ $reader = [Xml.XmlReader]::Create([IO.Path]::GetFullPath($Path), $settings)
+ try {
+ $document = [Xml.XmlDocument]::new()
+ $document.Load($reader)
+ $namespace = [Xml.XmlNamespaceManager]::new($document.NameTable)
+ $namespace.AddNamespace('t', 'http://microsoft.com/schemas/VisualStudio/TeamTest/2010')
+ $results = @($document.SelectNodes('/t:TestRun/t:Results/t:UnitTestResult', $namespace))
+ if ($results.Count -eq 0) { throw "No test results in '$Path'." }
+ $cases = @{}
+ $occurrences = @{}
+ foreach ($result in $results) {
+ $name = $result.GetAttribute('testName')
+ $prior = if ($occurrences.ContainsKey($name)) { [int] $occurrences[$name] } else { 0 }
+ $occurrences[$name] = 1 + $prior
+ $outcome = $result.GetAttribute('outcome')
+ if (-not $cases.ContainsKey($name) -or (Outcome-Rank $outcome) -gt (Outcome-Rank $cases[$name])) {
+ $cases[$name] = $outcome
+ }
+ }
+ return @{
+ Cases = $cases
+ Occurrences = $occurrences
+ Summary = [ordered]@{
+ path = [IO.Path]::GetFullPath($Path)
+ sha256 = (Get-FileHash -LiteralPath $Path).Hash
+ total = $results.Count
+ passed = @($results | Where-Object { $_.GetAttribute('outcome') -eq 'Passed' }).Count
+ allPassed = @($results | Where-Object { $_.GetAttribute('outcome') -ne 'Passed' }).Count -eq 0
+ }
+ }
+ }
+ finally { $reader.Dispose() }
+}
+
+$repository = [IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..'))
+$catalogPath = Join-Path $repository 'tests/CheatEngine.Mcp.Tests/Contract/Golden/backend-tools.json'
+$evidencePath = Join-Path $repository 'docs/qualification/all-tools/behavior-evidence.json'
+$liveEvidencePath = [IO.Path]::GetFullPath($LiveEvidencePath)
+$catalog = @(Get-Content -LiteralPath $catalogPath -Raw | ConvertFrom-Json -AsHashtable)
+$evidence = Get-Content -LiteralPath $evidencePath -Raw | ConvertFrom-Json -AsHashtable
+$liveEvidence = Get-Content -LiteralPath $liveEvidencePath -Raw | ConvertFrom-Json -AsHashtable
+
+function Outcome-Rank([string] $Outcome) {
+ switch ($Outcome) {
+ 'Passed' { return 0 }
+ 'NotExecuted' { return 1 }
+ 'Skipped' { return 1 }
+ 'Inconclusive' { return 2 }
+ 'Failed' { return 3 }
+ 'Missing' { return 4 }
+ 'MissingOrDuplicate' { return 4 }
+ default { return 3 }
+ }
+}
+
+function Select-WorstOutcome([string[]] $Outcomes) {
+ if ($Outcomes.Count -eq 0) { return 'Missing' }
+ return @($Outcomes | Sort-Object { Outcome-Rank $_ } -Descending | Select-Object -First 1)[0]
+}
+
+function Get-TestOutcome($Report, $Case) {
+ $outcomes = foreach ($name in @($Case['requiredCases'])) {
+ if ($null -eq $Report -or -not $Report.Cases.ContainsKey($name) -or $Report.Occurrences[$name] -ne 1) {
+ [ordered]@{ test = $name; outcome = 'MissingOrDuplicate' }
+ }
+ else {
+ [ordered]@{ test = $name; outcome = $Report.Cases[$name] }
+ }
+ }
+ return [ordered]@{ outcome = Select-WorstOutcome @($outcomes | ForEach-Object { $_['outcome'] }); cases = @($outcomes) }
+}
+
+function Get-ExactTestOutcome($Report, [string] $Method) {
+ if ($null -eq $Report) { return 'MissingOrDuplicate' }
+ $matches = @($Report.Cases.Keys | Where-Object {
+ $_ -eq $Method -or ($_.StartsWith($Method, [StringComparison]::Ordinal) -and
+ $_.Length -gt $Method.Length -and $_[$Method.Length] -eq '(')
+ })
+ if ($matches.Count -ne 1 -or $Report.Occurrences[$matches[0]] -ne 1) { return 'MissingOrDuplicate' }
+ return $Report.Cases[$matches[0]]
+}
+
+function Assert-BehaviorEvidence($Evidence, $Catalog, [string] $Repository) {
+ if ($Evidence['schema'] -ne 'cheatengine-mcp-behavior-evidence/v1') {
+ throw "Unsupported behavior evidence schema '$($Evidence['schema'])'."
+ }
+ if ($null -eq $Evidence['boundary'] -or [string]::IsNullOrWhiteSpace([string] $Evidence['boundary'])) {
+ throw 'Behavior evidence requires a non-empty boundary.'
+ }
+ $expected = @($Catalog | ForEach-Object { [string] $_['name'] })
+ $tools = @($Evidence['tools'])
+ $actual = @($tools | ForEach-Object { [string] $_['name'] })
+ if ($actual.Count -ne $expected.Count -or @($actual | Sort-Object -Unique).Count -ne $actual.Count -or
+ @(Compare-Object ($expected | Sort-Object) ($actual | Sort-Object)).Count -ne 0) {
+ throw 'Behavior evidence tool names must be the exact unique golden backend catalog names.'
+ }
+ $root = [IO.Path]::GetFullPath($Repository).TrimEnd([IO.Path]::DirectorySeparatorChar) + [IO.Path]::DirectorySeparatorChar
+ foreach ($tool in $tools) {
+ if (-not $tool.ContainsKey('cases') -or -not $tool.ContainsKey('remaining')) {
+ throw "Behavior evidence '$($tool['name'])' requires cases and remaining."
+ }
+ foreach ($case in @($tool['cases'])) {
+ foreach ($key in @('suite', 'testMethod', 'requiredCases', 'sourceFile', 'scope', 'oracle')) {
+ if (-not $case.ContainsKey($key) -or [string]::IsNullOrWhiteSpace([string] $case[$key])) {
+ throw "Behavior evidence '$($tool['name'])' has a case without $key."
+ }
+ }
+ if ($case['suite'] -notin @('portable', 'nativeLua')) { throw "Unknown suite '$($case['suite'])'." }
+ if ($case['scope'] -notin @('adapter', 'fixed_lua_body')) { throw "Unknown scope '$($case['scope'])'." }
+ $requiredCases = @($case['requiredCases'])
+ if ($requiredCases.Count -eq 0 -or @($requiredCases | Sort-Object -Unique).Count -ne $requiredCases.Count) {
+ throw "Behavior evidence '$($tool['name'])' requires non-empty unique requiredCases."
+ }
+ foreach ($required in $requiredCases) {
+ if ([string]::IsNullOrWhiteSpace([string] $required) -or
+ -not ($required -eq $case['testMethod'] -or ($required.StartsWith($case['testMethod'], [StringComparison]::Ordinal) -and
+ $required.Length -gt $case['testMethod'].Length -and $required[$case['testMethod'].Length] -eq '('))) {
+ throw "Behavior evidence '$($tool['name'])' has a required case outside testMethod '$($case['testMethod'])'."
+ }
+ }
+ if ([IO.Path]::IsPathRooted([string] $case['sourceFile'])) { throw "sourceFile must be repository-relative." }
+ $source = [IO.Path]::GetFullPath((Join-Path $Repository $case['sourceFile']))
+ if (-not $source.StartsWith($root, [StringComparison]::OrdinalIgnoreCase) -or -not (Test-Path -LiteralPath $source -PathType Leaf)) {
+ throw "sourceFile '$($case['sourceFile'])' is not an existing repository file."
+ }
+ }
+ }
+}
+
+function Assert-LiveEvidence($LiveMap, $Catalog, [string] $Repository) {
+ if ($LiveMap['schema'] -ne 'cheatengine-mcp-live-evidence/v1') {
+ throw "Unsupported live evidence schema '$($LiveMap['schema'])'."
+ }
+ if ([string]::IsNullOrWhiteSpace([string] $LiveMap['boundary'])) { throw 'Live evidence requires a non-empty boundary.' }
+ $names = @($LiveMap['tools'] | ForEach-Object { [string] $_['name'] })
+ $catalogNames = @($Catalog | ForEach-Object { [string] $_['name'] })
+ if ($names.Count -ne 37 -or @($names | Sort-Object -Unique).Count -ne $names.Count -or
+ @($names | Where-Object { $_ -notin $catalogNames }).Count -ne 0 -or $names -contains 'memory_dump_to_file') {
+ throw 'Live evidence must contain 37 unique golden backend tool names and exclude memory_dump_to_file.'
+ }
+ $root = [IO.Path]::GetFullPath($Repository).TrimEnd([IO.Path]::DirectorySeparatorChar) + [IO.Path]::DirectorySeparatorChar
+ foreach ($entry in @($LiveMap['tools'])) {
+ foreach ($key in @('name', 'sourceFile', 'testMethod', 'oracle', 'receipt', 'cleanupReceipt', 'scope')) {
+ if (-not $entry.ContainsKey($key) -or [string]::IsNullOrWhiteSpace([string] $entry[$key])) {
+ throw "Live evidence '$($entry['name'])' has no $key."
+ }
+ }
+ if ($entry['scope'] -notin @('safe_gate', 'reversible_workflow', 'read_only_workflow')) {
+ throw "Unknown live evidence scope '$($entry['scope'])'."
+ }
+ if ([IO.Path]::IsPathRooted([string] $entry['sourceFile'])) { throw 'Live sourceFile must be repository-relative.' }
+ $source = [IO.Path]::GetFullPath((Join-Path $Repository $entry['sourceFile']))
+ if (-not $source.StartsWith($root, [StringComparison]::OrdinalIgnoreCase) -or -not (Test-Path -LiteralPath $source -PathType Leaf)) {
+ throw "Live sourceFile '$($entry['sourceFile'])' is not an existing repository file."
+ }
+ }
+}
+
+function Read-LiveReceipts([string] $SummaryPath) {
+ $path = Join-Path (Split-Path -Parent ([IO.Path]::GetFullPath($SummaryPath))) 'receipts.jsonl'
+ if (-not (Test-Path -LiteralPath $path -PathType Leaf)) { throw "Live receipt file '$path' is missing." }
+ $counts = @{}
+ foreach ($line in Get-Content -LiteralPath $path) {
+ if ([string]::IsNullOrWhiteSpace($line)) { continue }
+ $entry = $line | ConvertFrom-Json -AsHashtable
+ if (-not $entry.ContainsKey('name') -or [string]::IsNullOrWhiteSpace([string] $entry['name'])) { throw "Live receipt file '$path' has an unnamed row." }
+ $name = [string] $entry['name']
+ $prior = if ($counts.ContainsKey($name)) { [int] $counts[$name] } else { 0 }
+ $counts[$name] = 1 + $prior
+ }
+ return @{ path = $path; sha256 = (Get-FileHash -LiteralPath $path).Hash; counts = $counts }
+}
+
+Assert-BehaviorEvidence $evidence $catalog $repository
+Assert-LiveEvidence -LiveMap $liveEvidence -Catalog $catalog -Repository $repository
+$gateway = Read-TestReport $GatewayTrx
+$suiteReports = [ordered]@{ gateway = $gateway.Summary }
+$behaviorReports = @{}
+foreach ($entry in @(@{ Name = 'portable'; Path = $PortableTrx }, @{ Name = 'nativeLua'; Path = $NativeLuaTrx })) {
+ if ($entry.Path) {
+ $parsed = Read-TestReport $entry.Path
+ $suiteReports[$entry.Name] = $parsed.Summary
+ $behaviorReports[$entry.Name] = $parsed
+ }
+}
+$live = if ($LiveSummary) { Get-Content -LiteralPath $LiveSummary -Raw | ConvertFrom-Json -AsHashtable } else { @{} }
+$liveReceipts = if ($LiveSummary) { Read-LiveReceipts $LiveSummary } else { $null }
+$livePassed = $live['passed'] -eq $true -and $live['userStateRestored'] -eq $true -and
+ $live['sourceInstallationUnchanged'] -eq $true -and $live.ContainsKey('cleanupFailures') -and
+ @($live['cleanupFailures']).Count -eq 0 -and $live['schema'] -eq 'cheatengine-mcp-live-multi-instance/v1' -and
+ $live.ContainsKey('selected_distribution') -and $live['selected_distribution'].ContainsKey('productVersion') -and
+ $live['selected_distribution'].ContainsKey('pluginSha256') -and $live['selected_distribution'].ContainsKey('gatewaySha256')
+$methods = @('CallTool_MissingInstanceId_RejectsEveryBackendToolBeforeAnyBackendContact',
+ 'CallTool_UnknownInstanceId_RejectsEveryBackendToolWithoutFallback',
+ 'CallTool_StaleIdentity_RejectsEveryBackendToolBeforeMutation',
+ 'CallTool_TwoInstances_RoutesEveryBackendToolWithOnlyInstanceIdRemoved')
+$evidenceByTool = @{}
+foreach ($entry in @($evidence['tools'])) { $evidenceByTool[$entry['name']] = $entry }
+$liveEvidenceByTool = @{}
+foreach ($entry in @($liveEvidence['tools'])) { $liveEvidenceByTool[$entry['name']] = $entry }
+$tools = @($catalog) + @(@{ name = 'instance_list'; title = 'List instances'; _meta = @{} })
+$rows = foreach ($tool in $tools | Sort-Object { $_['name'] }) {
+ $name = $tool['name']
+ $routingCases = if ($name -eq 'instance_list') {
+ @('InstanceList_EmptyRegistry_ReturnsLocalEmptyDiscoveryResult', 'InstanceList_PublishedDoubles_ReturnsBothVerifiedInstancesWithoutTokens') |
+ ForEach-Object { [ordered]@{ test = "CheatEngine.Mcp.Tests.Hosting.AllToolGatewayQualificationTests.$_"; outcome = Get-ExactTestOutcome $gateway "CheatEngine.Mcp.Tests.Hosting.AllToolGatewayQualificationTests.$_" } }
+ } else {
+ $methods | ForEach-Object {
+ $method = "CheatEngine.Mcp.Tests.Hosting.AllToolGatewayQualificationTests.$_"
+ $test = "$method(tool: `"$name`")"
+ [ordered]@{ test = $test; outcome = Get-ExactTestOutcome $gateway $test }
+ }
+ }
+ $sourceCases = if ($name -eq 'instance_list') { @() } else { @($evidenceByTool[$name]['cases']) }
+ $asEvidence = foreach ($case in $sourceCases) {
+ $testOutcome = Get-TestOutcome $behaviorReports[$case['suite']] $case
+ [ordered]@{ suite = $case['suite']; test = $case['testMethod']; selectors = @($case['requiredCases']); sourceFile = $case['sourceFile']; scope = $case['scope']; oracle = $case['oracle']; outcome = $testOutcome['outcome']; caseOutcomes = $testOutcome['cases'] }
+ }
+ $adapterEvidence = @($asEvidence | Where-Object { $_['scope'] -eq 'adapter' })
+ $fixedEvidence = @($asEvidence | Where-Object { $_['scope'] -eq 'fixed_lua_body' })
+ $liveCase = $liveEvidenceByTool[$name]
+ $liveReceiptPresent = $null -ne $liveCase -and $liveReceipts -and $liveReceipts.counts[$liveCase['receipt']] -eq 1
+ $cleanupReceiptPresent = $null -ne $liveCase -and ($liveCase['cleanupReceipt'] -eq 'none' -or
+ ($liveReceipts -and $liveReceipts.counts[$liveCase['cleanupReceipt']] -eq 1))
+ [ordered]@{
+ name = $name; title = $tool['title']; requiredFeatures = @($tool['_meta']['cheatengine/requires'] | Where-Object { $_ })
+ routing = if (@($routingCases | Where-Object { $_.outcome -ne 'Passed' }).Count -eq 0) { 'passed' } else { 'incomplete' }
+ routingCases = $routingCases
+ behavior = if ($adapterEvidence.Count -gt 0 -and @($adapterEvidence | Where-Object { $_.outcome -ne 'Passed' }).Count -eq 0) { 'verified_with_doubles' } else { 'requires_reviewed_per_tool_evidence' }
+ adapterEvidence = $adapterEvidence; fixedLuaBodyEvidence = $fixedEvidence
+ remaining = if ($name -eq 'instance_list') { 'Local gateway discovery only; no backend behavior applies.' } else { $evidenceByTool[$name]['remaining'] }
+ live = if ($null -eq $liveCase) { 'not_verified' } elseif ($livePassed -and $liveReceiptPresent -and $cleanupReceiptPresent) { 'verified' } elseif (-not $livePassed -and $liveReceiptPresent) { 'observed_in_failed_session' } else { 'not_verified' }
+ liveEvidence = if ($null -eq $liveCase) { $null } else { [ordered]@{ scope = $liveCase['scope']; sourceFile = $liveCase['sourceFile']; testMethod = $liveCase['testMethod']; oracle = $liveCase['oracle']; receipt = $liveCase['receipt']; cleanupReceipt = $liveCase['cleanupReceipt']; receiptPresent = $liveReceiptPresent; cleanupReceiptPresent = $cleanupReceiptPresent } }
+ }
+}
+$report = [ordered]@{
+ schema = 'cheatengine-mcp-all-tools/v1'; generatedUtc = [DateTimeOffset]::UtcNow.ToString('O')
+ catalogSha256 = (Get-FileHash -LiteralPath $catalogPath).Hash; evidenceSha256 = (Get-FileHash -LiteralPath $evidencePath).Hash; liveEvidenceSha256 = (Get-FileHash -LiteralPath $liveEvidencePath).Hash
+ toolCount = $rows.Count; routingComplete = @($rows | Where-Object { $_.routing -ne 'passed' }).Count -eq 0
+ nativeQualificationComplete = $false
+ boundaries = @('Routing uses loopback doubles; it does not execute backend tools.', 'Fixed Lua body evidence bypasses the adapter and never qualifies adapter behavior.', 'Suite totals never infer per-tool positive evidence.', 'Failed live sessions are not verified.', 'Missing tests are Missing; refusals do not qualify success.')
+ suites = $suiteReports; liveSession = if ($LiveSummary) { [ordered]@{ summaryPath = [IO.Path]::GetFullPath($LiveSummary); summarySha256 = (Get-FileHash -LiteralPath $LiveSummary).Hash; receiptsPath = $liveReceipts.path; receiptsSha256 = $liveReceipts.sha256; passed = $livePassed; runId = $live['runId']; candidateIdentity = $live['selected_distribution']; host = $live['host'] } } else { $null }
+ tools = @($rows)
+}
+[IO.Directory]::CreateDirectory([IO.Path]::GetFullPath($OutputDirectory)) | Out-Null
+$output = Join-Path $OutputDirectory 'tool-results.json'
+$report | ConvertTo-Json -Depth 16 | Set-Content -LiteralPath $output -Encoding utf8
+[pscustomobject]@{ Report = [IO.Path]::GetFullPath($output); Tools = $rows.Count; RoutingComplete = $report.routingComplete; NativeQualificationComplete = $false }
diff --git a/libs/CheatEngine.Mcp.Core/packages.lock.json b/libs/CheatEngine.Mcp.Core/packages.lock.json
index 0eb0443..d0684ca 100644
--- a/libs/CheatEngine.Mcp.Core/packages.lock.json
+++ b/libs/CheatEngine.Mcp.Core/packages.lock.json
@@ -4,12 +4,12 @@
"net10.0": {
"CheatEngine.Client": {
"type": "Direct",
- "requested": "[1.0.0, )",
- "resolved": "1.0.0",
- "contentHash": "nJ262v9o4Z2QXmG8+Ny5G0V850IYQIdL6GMnugvwPQiqyI3zZgOplU0HBSM+vX1B8k+geTXUFS53IZA03EtigA==",
+ "requested": "[1.1.0, )",
+ "resolved": "1.1.0",
+ "contentHash": "7Gwflxn1fzSMgHFecIhnUwiOHHuM2ysBKa8e0okkr6S/b8Xv821vlGpJHA0LGT8rzhJ8Otbx5PH03//pfgrNVw==",
"dependencies": {
- "CheatEngine.Client.Fluent": "[1.0.0]",
- "CheatEngine.Client.Hosting": "[1.0.0]"
+ "CheatEngine.Client.Fluent": "[1.1.0]",
+ "CheatEngine.Client.Hosting": "[1.1.0]"
}
},
"Microsoft.NET.ILLink.Tasks": {
@@ -31,28 +31,28 @@
},
"CheatEngine.Client.Abstractions": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "1Ma1AEwpAZ2Q6c16ydNzOIsnchanixkH0VgSASOoRoeV+DPtTp98zfi4ZDLat/fkMXxPJNysCGRVRxm5hES+eg==",
+ "resolved": "1.1.0",
+ "contentHash": "CpaOmRG1KJ7f6QxWXowEp8ySvBbb7qTQWB12ulocau35SUYpz9Ug0R52zYoJc+nEeVcQhLCGp/nzuoIJHD9tfg==",
"dependencies": {
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Core": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "MHYLqRPy1NGm8k5uyMB9PnazHwPCyQgs1qUYrei47M0gDUW3yChZJ6N7xrcsng4bJTiqUqIvfOIoPU3MCSr5VA==",
+ "resolved": "1.1.0",
+ "contentHash": "p3Av7agZlLZxr5fvwbW2Uq8TPwOT+PTzs/Hs92zcA8egpQUqyhnAzQOSWPJUNVk+TYDnXWj0nvQwcDMiaEfkTw==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Extensions.DependencyInjection": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "d7zKtwOIkBg7dyXLMP8Z9saHVRj1D82/wg4mAo6ds37ecVylVWzsGusNU2HXiN705pTbs6NRB7k8LEak/KR3Cw==",
+ "resolved": "1.1.0",
+ "contentHash": "ARBq9El8zUijcol/NS/mabxeWHVhPc8flDWQLnEIYoFo9nipLgPwG8SzZT+IckA0BqPtu6LPn3UZDsHReBYqSA==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
- "CheatEngine.Client.Core": "[1.0.0]",
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
+ "CheatEngine.Client.Core": "[1.1.0]",
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12",
"Microsoft.Extensions.DependencyInjection": "10.0.12",
"Microsoft.Extensions.Logging": "10.0.12",
@@ -62,18 +62,18 @@
},
"CheatEngine.Client.Fluent": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "8/4JcuUjaG7iWHgpg6j+nt3r4xSfV5KyjlJ9NlMbX0SWKoRIbTXeUezQjmA0X5XfC76JOmWLBCPuPGbKHv4dmg==",
+ "resolved": "1.1.0",
+ "contentHash": "Q4baX9mQpyuGRO8x1ROOMidejY1o6I9Zkh2uCFEHMIkZK+bdzMas+yQzPyJt80jQUH0InAqCb1tnk4AjELRQZQ==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]"
+ "CheatEngine.Client.Abstractions": "[1.1.0]"
}
},
"CheatEngine.Client.Hosting": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "NxpEXtZ6VN1URhR3mrD6uAqr7Os5zp2y7k45X1+2k0M68XBQC+HIobp9QUBb/q5d2tDgAlZxpHWuS6xhasqJTQ==",
+ "resolved": "1.1.0",
+ "contentHash": "atDiA6dpnP7Mo6dZ9G3XIou8rc2Vc9g5YKvYnps7hwzKP+pY8NUC6O3J8/IiyvN8G0QIZeL7QGSILt8AuCnqIg==",
"dependencies": {
- "CheatEngine.Client.Extensions.DependencyInjection": "[1.0.0]",
+ "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)",
"Microsoft.Extensions.DependencyInjection": "10.0.12",
"Microsoft.Extensions.Logging": "10.0.12"
@@ -182,9 +182,9 @@
},
"CheatEngine.SDK": {
"type": "CentralTransitive",
- "requested": "[2.0.0, )",
- "resolved": "2.0.0",
- "contentHash": "NLEdZYJ9LKW3EFNB4X5snKCQf7ZS86GkCQ+El7o+S1XQcxHQGjS45Q1ap8lfjQuIwm004mQ3TPxo+ph1yvRrlQ=="
+ "requested": "[2.0.1, )",
+ "resolved": "2.0.1",
+ "contentHash": "coRWNRz81E5N3PQeruDzHEDSeQQMSYkuCIx9LpKWO3qP61v6hbyRvYlHzjco2iNVykxy9z25zVbivUbxpA5dow=="
},
"Microsoft.Extensions.AI.Abstractions": {
"type": "CentralTransitive",
diff --git a/srcs/CheatEngine.Mcp.Gateway/packages.aot.lock.json b/srcs/CheatEngine.Mcp.Gateway/packages.aot.lock.json
index eb3a608..7c5ff07 100644
--- a/srcs/CheatEngine.Mcp.Gateway/packages.aot.lock.json
+++ b/srcs/CheatEngine.Mcp.Gateway/packages.aot.lock.json
@@ -16,44 +16,44 @@
},
"CheatEngine.Client.Abstractions": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "1Ma1AEwpAZ2Q6c16ydNzOIsnchanixkH0VgSASOoRoeV+DPtTp98zfi4ZDLat/fkMXxPJNysCGRVRxm5hES+eg==",
+ "resolved": "1.1.0",
+ "contentHash": "CpaOmRG1KJ7f6QxWXowEp8ySvBbb7qTQWB12ulocau35SUYpz9Ug0R52zYoJc+nEeVcQhLCGp/nzuoIJHD9tfg==",
"dependencies": {
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Core": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "MHYLqRPy1NGm8k5uyMB9PnazHwPCyQgs1qUYrei47M0gDUW3yChZJ6N7xrcsng4bJTiqUqIvfOIoPU3MCSr5VA==",
+ "resolved": "1.1.0",
+ "contentHash": "p3Av7agZlLZxr5fvwbW2Uq8TPwOT+PTzs/Hs92zcA8egpQUqyhnAzQOSWPJUNVk+TYDnXWj0nvQwcDMiaEfkTw==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Extensions.DependencyInjection": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "d7zKtwOIkBg7dyXLMP8Z9saHVRj1D82/wg4mAo6ds37ecVylVWzsGusNU2HXiN705pTbs6NRB7k8LEak/KR3Cw==",
+ "resolved": "1.1.0",
+ "contentHash": "ARBq9El8zUijcol/NS/mabxeWHVhPc8flDWQLnEIYoFo9nipLgPwG8SzZT+IckA0BqPtu6LPn3UZDsHReBYqSA==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
- "CheatEngine.Client.Core": "[1.0.0]"
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
+ "CheatEngine.Client.Core": "[1.1.0]"
}
},
"CheatEngine.Client.Fluent": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "8/4JcuUjaG7iWHgpg6j+nt3r4xSfV5KyjlJ9NlMbX0SWKoRIbTXeUezQjmA0X5XfC76JOmWLBCPuPGbKHv4dmg==",
+ "resolved": "1.1.0",
+ "contentHash": "Q4baX9mQpyuGRO8x1ROOMidejY1o6I9Zkh2uCFEHMIkZK+bdzMas+yQzPyJt80jQUH0InAqCb1tnk4AjELRQZQ==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]"
+ "CheatEngine.Client.Abstractions": "[1.1.0]"
}
},
"CheatEngine.Client.Hosting": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "NxpEXtZ6VN1URhR3mrD6uAqr7Os5zp2y7k45X1+2k0M68XBQC+HIobp9QUBb/q5d2tDgAlZxpHWuS6xhasqJTQ==",
+ "resolved": "1.1.0",
+ "contentHash": "atDiA6dpnP7Mo6dZ9G3XIou8rc2Vc9g5YKvYnps7hwzKP+pY8NUC6O3J8/IiyvN8G0QIZeL7QGSILt8AuCnqIg==",
"dependencies": {
- "CheatEngine.Client.Extensions.DependencyInjection": "[1.0.0]",
+ "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
@@ -68,52 +68,52 @@
"cheatengine.mcp.core": {
"type": "Project",
"dependencies": {
- "CheatEngine.Client": "[1.0.0, )",
+ "CheatEngine.Client": "[1.1.0, )",
"ModelContextProtocol": "[2.2.0, )"
}
},
"cheatengine.mcp.hosting": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0, )",
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )",
"ModelContextProtocol.AspNetCore": "[2.2.0, )"
}
},
"cheatengine.mcp.prompts": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0, )",
- "CheatEngine.Mcp.Resources": "[2.0.0, )"
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )",
+ "CheatEngine.Mcp.Resources": "[2.0.0-beta.4, )"
}
},
"cheatengine.mcp.resources": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0, )",
- "CheatEngine.Mcp.Tools": "[2.0.0, )"
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )",
+ "CheatEngine.Mcp.Tools": "[2.0.0-beta.4, )"
}
},
"cheatengine.mcp.tools": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0, )"
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )"
}
},
"CheatEngine.Client": {
"type": "CentralTransitive",
- "requested": "[1.0.0, )",
- "resolved": "1.0.0",
- "contentHash": "nJ262v9o4Z2QXmG8+Ny5G0V850IYQIdL6GMnugvwPQiqyI3zZgOplU0HBSM+vX1B8k+geTXUFS53IZA03EtigA==",
+ "requested": "[1.1.0, )",
+ "resolved": "1.1.0",
+ "contentHash": "7Gwflxn1fzSMgHFecIhnUwiOHHuM2ysBKa8e0okkr6S/b8Xv821vlGpJHA0LGT8rzhJ8Otbx5PH03//pfgrNVw==",
"dependencies": {
- "CheatEngine.Client.Fluent": "[1.0.0]",
- "CheatEngine.Client.Hosting": "[1.0.0]"
+ "CheatEngine.Client.Fluent": "[1.1.0]",
+ "CheatEngine.Client.Hosting": "[1.1.0]"
}
},
"CheatEngine.SDK": {
"type": "CentralTransitive",
- "requested": "[2.0.0, )",
- "resolved": "2.0.0",
- "contentHash": "NLEdZYJ9LKW3EFNB4X5snKCQf7ZS86GkCQ+El7o+S1XQcxHQGjS45Q1ap8lfjQuIwm004mQ3TPxo+ph1yvRrlQ=="
+ "requested": "[2.0.1, )",
+ "resolved": "2.0.1",
+ "contentHash": "coRWNRz81E5N3PQeruDzHEDSeQQMSYkuCIx9LpKWO3qP61v6hbyRvYlHzjco2iNVykxy9z25zVbivUbxpA5dow=="
},
"Microsoft.Extensions.AI.Abstractions": {
"type": "CentralTransitive",
diff --git a/srcs/CheatEngine.Mcp.Gateway/packages.lock.json b/srcs/CheatEngine.Mcp.Gateway/packages.lock.json
index 79cde4e..92f7542 100644
--- a/srcs/CheatEngine.Mcp.Gateway/packages.lock.json
+++ b/srcs/CheatEngine.Mcp.Gateway/packages.lock.json
@@ -10,44 +10,44 @@
},
"CheatEngine.Client.Abstractions": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "1Ma1AEwpAZ2Q6c16ydNzOIsnchanixkH0VgSASOoRoeV+DPtTp98zfi4ZDLat/fkMXxPJNysCGRVRxm5hES+eg==",
+ "resolved": "1.1.0",
+ "contentHash": "CpaOmRG1KJ7f6QxWXowEp8ySvBbb7qTQWB12ulocau35SUYpz9Ug0R52zYoJc+nEeVcQhLCGp/nzuoIJHD9tfg==",
"dependencies": {
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Core": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "MHYLqRPy1NGm8k5uyMB9PnazHwPCyQgs1qUYrei47M0gDUW3yChZJ6N7xrcsng4bJTiqUqIvfOIoPU3MCSr5VA==",
+ "resolved": "1.1.0",
+ "contentHash": "p3Av7agZlLZxr5fvwbW2Uq8TPwOT+PTzs/Hs92zcA8egpQUqyhnAzQOSWPJUNVk+TYDnXWj0nvQwcDMiaEfkTw==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Extensions.DependencyInjection": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "d7zKtwOIkBg7dyXLMP8Z9saHVRj1D82/wg4mAo6ds37ecVylVWzsGusNU2HXiN705pTbs6NRB7k8LEak/KR3Cw==",
+ "resolved": "1.1.0",
+ "contentHash": "ARBq9El8zUijcol/NS/mabxeWHVhPc8flDWQLnEIYoFo9nipLgPwG8SzZT+IckA0BqPtu6LPn3UZDsHReBYqSA==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
- "CheatEngine.Client.Core": "[1.0.0]"
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
+ "CheatEngine.Client.Core": "[1.1.0]"
}
},
"CheatEngine.Client.Fluent": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "8/4JcuUjaG7iWHgpg6j+nt3r4xSfV5KyjlJ9NlMbX0SWKoRIbTXeUezQjmA0X5XfC76JOmWLBCPuPGbKHv4dmg==",
+ "resolved": "1.1.0",
+ "contentHash": "Q4baX9mQpyuGRO8x1ROOMidejY1o6I9Zkh2uCFEHMIkZK+bdzMas+yQzPyJt80jQUH0InAqCb1tnk4AjELRQZQ==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]"
+ "CheatEngine.Client.Abstractions": "[1.1.0]"
}
},
"CheatEngine.Client.Hosting": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "NxpEXtZ6VN1URhR3mrD6uAqr7Os5zp2y7k45X1+2k0M68XBQC+HIobp9QUBb/q5d2tDgAlZxpHWuS6xhasqJTQ==",
+ "resolved": "1.1.0",
+ "contentHash": "atDiA6dpnP7Mo6dZ9G3XIou8rc2Vc9g5YKvYnps7hwzKP+pY8NUC6O3J8/IiyvN8G0QIZeL7QGSILt8AuCnqIg==",
"dependencies": {
- "CheatEngine.Client.Extensions.DependencyInjection": "[1.0.0]",
+ "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
@@ -62,52 +62,52 @@
"cheatengine.mcp.core": {
"type": "Project",
"dependencies": {
- "CheatEngine.Client": "[1.0.0, )",
+ "CheatEngine.Client": "[1.1.0, )",
"ModelContextProtocol": "[2.2.0, )"
}
},
"cheatengine.mcp.hosting": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )",
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )",
"ModelContextProtocol.AspNetCore": "[2.2.0, )"
}
},
"cheatengine.mcp.prompts": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )",
- "CheatEngine.Mcp.Resources": "[2.0.0-beta.3, )"
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )",
+ "CheatEngine.Mcp.Resources": "[2.0.0-beta.4, )"
}
},
"cheatengine.mcp.resources": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )",
- "CheatEngine.Mcp.Tools": "[2.0.0-beta.3, )"
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )",
+ "CheatEngine.Mcp.Tools": "[2.0.0-beta.4, )"
}
},
"cheatengine.mcp.tools": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )"
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )"
}
},
"CheatEngine.Client": {
"type": "CentralTransitive",
- "requested": "[1.0.0, )",
- "resolved": "1.0.0",
- "contentHash": "nJ262v9o4Z2QXmG8+Ny5G0V850IYQIdL6GMnugvwPQiqyI3zZgOplU0HBSM+vX1B8k+geTXUFS53IZA03EtigA==",
+ "requested": "[1.1.0, )",
+ "resolved": "1.1.0",
+ "contentHash": "7Gwflxn1fzSMgHFecIhnUwiOHHuM2ysBKa8e0okkr6S/b8Xv821vlGpJHA0LGT8rzhJ8Otbx5PH03//pfgrNVw==",
"dependencies": {
- "CheatEngine.Client.Fluent": "[1.0.0]",
- "CheatEngine.Client.Hosting": "[1.0.0]"
+ "CheatEngine.Client.Fluent": "[1.1.0]",
+ "CheatEngine.Client.Hosting": "[1.1.0]"
}
},
"CheatEngine.SDK": {
"type": "CentralTransitive",
- "requested": "[2.0.0, )",
- "resolved": "2.0.0",
- "contentHash": "NLEdZYJ9LKW3EFNB4X5snKCQf7ZS86GkCQ+El7o+S1XQcxHQGjS45Q1ap8lfjQuIwm004mQ3TPxo+ph1yvRrlQ=="
+ "requested": "[2.0.1, )",
+ "resolved": "2.0.1",
+ "contentHash": "coRWNRz81E5N3PQeruDzHEDSeQQMSYkuCIx9LpKWO3qP61v6hbyRvYlHzjco2iNVykxy9z25zVbivUbxpA5dow=="
},
"Microsoft.Extensions.AI.Abstractions": {
"type": "CentralTransitive",
diff --git a/srcs/CheatEngine.Mcp.Hosting/packages.lock.json b/srcs/CheatEngine.Mcp.Hosting/packages.lock.json
index c651d55..995788a 100644
--- a/srcs/CheatEngine.Mcp.Hosting/packages.lock.json
+++ b/srcs/CheatEngine.Mcp.Hosting/packages.lock.json
@@ -19,44 +19,44 @@
},
"CheatEngine.Client.Abstractions": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "1Ma1AEwpAZ2Q6c16ydNzOIsnchanixkH0VgSASOoRoeV+DPtTp98zfi4ZDLat/fkMXxPJNysCGRVRxm5hES+eg==",
+ "resolved": "1.1.0",
+ "contentHash": "CpaOmRG1KJ7f6QxWXowEp8ySvBbb7qTQWB12ulocau35SUYpz9Ug0R52zYoJc+nEeVcQhLCGp/nzuoIJHD9tfg==",
"dependencies": {
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Core": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "MHYLqRPy1NGm8k5uyMB9PnazHwPCyQgs1qUYrei47M0gDUW3yChZJ6N7xrcsng4bJTiqUqIvfOIoPU3MCSr5VA==",
+ "resolved": "1.1.0",
+ "contentHash": "p3Av7agZlLZxr5fvwbW2Uq8TPwOT+PTzs/Hs92zcA8egpQUqyhnAzQOSWPJUNVk+TYDnXWj0nvQwcDMiaEfkTw==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Extensions.DependencyInjection": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "d7zKtwOIkBg7dyXLMP8Z9saHVRj1D82/wg4mAo6ds37ecVylVWzsGusNU2HXiN705pTbs6NRB7k8LEak/KR3Cw==",
+ "resolved": "1.1.0",
+ "contentHash": "ARBq9El8zUijcol/NS/mabxeWHVhPc8flDWQLnEIYoFo9nipLgPwG8SzZT+IckA0BqPtu6LPn3UZDsHReBYqSA==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
- "CheatEngine.Client.Core": "[1.0.0]"
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
+ "CheatEngine.Client.Core": "[1.1.0]"
}
},
"CheatEngine.Client.Fluent": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "8/4JcuUjaG7iWHgpg6j+nt3r4xSfV5KyjlJ9NlMbX0SWKoRIbTXeUezQjmA0X5XfC76JOmWLBCPuPGbKHv4dmg==",
+ "resolved": "1.1.0",
+ "contentHash": "Q4baX9mQpyuGRO8x1ROOMidejY1o6I9Zkh2uCFEHMIkZK+bdzMas+yQzPyJt80jQUH0InAqCb1tnk4AjELRQZQ==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]"
+ "CheatEngine.Client.Abstractions": "[1.1.0]"
}
},
"CheatEngine.Client.Hosting": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "NxpEXtZ6VN1URhR3mrD6uAqr7Os5zp2y7k45X1+2k0M68XBQC+HIobp9QUBb/q5d2tDgAlZxpHWuS6xhasqJTQ==",
+ "resolved": "1.1.0",
+ "contentHash": "atDiA6dpnP7Mo6dZ9G3XIou8rc2Vc9g5YKvYnps7hwzKP+pY8NUC6O3J8/IiyvN8G0QIZeL7QGSILt8AuCnqIg==",
"dependencies": {
- "CheatEngine.Client.Extensions.DependencyInjection": "[1.0.0]",
+ "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
@@ -71,25 +71,25 @@
"cheatengine.mcp.core": {
"type": "Project",
"dependencies": {
- "CheatEngine.Client": "[1.0.0, )",
+ "CheatEngine.Client": "[1.1.0, )",
"ModelContextProtocol": "[2.2.0, )"
}
},
"CheatEngine.Client": {
"type": "CentralTransitive",
- "requested": "[1.0.0, )",
- "resolved": "1.0.0",
- "contentHash": "nJ262v9o4Z2QXmG8+Ny5G0V850IYQIdL6GMnugvwPQiqyI3zZgOplU0HBSM+vX1B8k+geTXUFS53IZA03EtigA==",
+ "requested": "[1.1.0, )",
+ "resolved": "1.1.0",
+ "contentHash": "7Gwflxn1fzSMgHFecIhnUwiOHHuM2ysBKa8e0okkr6S/b8Xv821vlGpJHA0LGT8rzhJ8Otbx5PH03//pfgrNVw==",
"dependencies": {
- "CheatEngine.Client.Fluent": "[1.0.0]",
- "CheatEngine.Client.Hosting": "[1.0.0]"
+ "CheatEngine.Client.Fluent": "[1.1.0]",
+ "CheatEngine.Client.Hosting": "[1.1.0]"
}
},
"CheatEngine.SDK": {
"type": "CentralTransitive",
- "requested": "[2.0.0, )",
- "resolved": "2.0.0",
- "contentHash": "NLEdZYJ9LKW3EFNB4X5snKCQf7ZS86GkCQ+El7o+S1XQcxHQGjS45Q1ap8lfjQuIwm004mQ3TPxo+ph1yvRrlQ=="
+ "requested": "[2.0.1, )",
+ "resolved": "2.0.1",
+ "contentHash": "coRWNRz81E5N3PQeruDzHEDSeQQMSYkuCIx9LpKWO3qP61v6hbyRvYlHzjco2iNVykxy9z25zVbivUbxpA5dow=="
},
"Microsoft.Extensions.AI.Abstractions": {
"type": "CentralTransitive",
diff --git a/srcs/CheatEngine.Mcp.Plugin/packages.lock.json b/srcs/CheatEngine.Mcp.Plugin/packages.lock.json
index 3a1d921..efaa30c 100644
--- a/srcs/CheatEngine.Mcp.Plugin/packages.lock.json
+++ b/srcs/CheatEngine.Mcp.Plugin/packages.lock.json
@@ -4,19 +4,19 @@
"net10.0": {
"CheatEngine.Client": {
"type": "Direct",
- "requested": "[1.0.0, )",
- "resolved": "1.0.0",
- "contentHash": "nJ262v9o4Z2QXmG8+Ny5G0V850IYQIdL6GMnugvwPQiqyI3zZgOplU0HBSM+vX1B8k+geTXUFS53IZA03EtigA==",
+ "requested": "[1.1.0, )",
+ "resolved": "1.1.0",
+ "contentHash": "7Gwflxn1fzSMgHFecIhnUwiOHHuM2ysBKa8e0okkr6S/b8Xv821vlGpJHA0LGT8rzhJ8Otbx5PH03//pfgrNVw==",
"dependencies": {
- "CheatEngine.Client.Fluent": "[1.0.0]",
- "CheatEngine.Client.Hosting": "[1.0.0]"
+ "CheatEngine.Client.Fluent": "[1.1.0]",
+ "CheatEngine.Client.Hosting": "[1.1.0]"
}
},
"CheatEngine.SDK": {
"type": "Direct",
- "requested": "[2.0.0, )",
- "resolved": "2.0.0",
- "contentHash": "NLEdZYJ9LKW3EFNB4X5snKCQf7ZS86GkCQ+El7o+S1XQcxHQGjS45Q1ap8lfjQuIwm004mQ3TPxo+ph1yvRrlQ=="
+ "requested": "[2.0.1, )",
+ "resolved": "2.0.1",
+ "contentHash": "coRWNRz81E5N3PQeruDzHEDSeQQMSYkuCIx9LpKWO3qP61v6hbyRvYlHzjco2iNVykxy9z25zVbivUbxpA5dow=="
},
"Costura.Fody": {
"type": "Direct",
@@ -50,44 +50,44 @@
},
"CheatEngine.Client.Abstractions": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "1Ma1AEwpAZ2Q6c16ydNzOIsnchanixkH0VgSASOoRoeV+DPtTp98zfi4ZDLat/fkMXxPJNysCGRVRxm5hES+eg==",
+ "resolved": "1.1.0",
+ "contentHash": "CpaOmRG1KJ7f6QxWXowEp8ySvBbb7qTQWB12ulocau35SUYpz9Ug0R52zYoJc+nEeVcQhLCGp/nzuoIJHD9tfg==",
"dependencies": {
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Core": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "MHYLqRPy1NGm8k5uyMB9PnazHwPCyQgs1qUYrei47M0gDUW3yChZJ6N7xrcsng4bJTiqUqIvfOIoPU3MCSr5VA==",
+ "resolved": "1.1.0",
+ "contentHash": "p3Av7agZlLZxr5fvwbW2Uq8TPwOT+PTzs/Hs92zcA8egpQUqyhnAzQOSWPJUNVk+TYDnXWj0nvQwcDMiaEfkTw==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Extensions.DependencyInjection": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "d7zKtwOIkBg7dyXLMP8Z9saHVRj1D82/wg4mAo6ds37ecVylVWzsGusNU2HXiN705pTbs6NRB7k8LEak/KR3Cw==",
+ "resolved": "1.1.0",
+ "contentHash": "ARBq9El8zUijcol/NS/mabxeWHVhPc8flDWQLnEIYoFo9nipLgPwG8SzZT+IckA0BqPtu6LPn3UZDsHReBYqSA==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
- "CheatEngine.Client.Core": "[1.0.0]"
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
+ "CheatEngine.Client.Core": "[1.1.0]"
}
},
"CheatEngine.Client.Fluent": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "8/4JcuUjaG7iWHgpg6j+nt3r4xSfV5KyjlJ9NlMbX0SWKoRIbTXeUezQjmA0X5XfC76JOmWLBCPuPGbKHv4dmg==",
+ "resolved": "1.1.0",
+ "contentHash": "Q4baX9mQpyuGRO8x1ROOMidejY1o6I9Zkh2uCFEHMIkZK+bdzMas+yQzPyJt80jQUH0InAqCb1tnk4AjELRQZQ==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]"
+ "CheatEngine.Client.Abstractions": "[1.1.0]"
}
},
"CheatEngine.Client.Hosting": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "NxpEXtZ6VN1URhR3mrD6uAqr7Os5zp2y7k45X1+2k0M68XBQC+HIobp9QUBb/q5d2tDgAlZxpHWuS6xhasqJTQ==",
+ "resolved": "1.1.0",
+ "contentHash": "atDiA6dpnP7Mo6dZ9G3XIou8rc2Vc9g5YKvYnps7hwzKP+pY8NUC6O3J8/IiyvN8G0QIZeL7QGSILt8AuCnqIg==",
"dependencies": {
- "CheatEngine.Client.Extensions.DependencyInjection": "[1.0.0]",
+ "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
@@ -102,35 +102,35 @@
"cheatengine.mcp.core": {
"type": "Project",
"dependencies": {
- "CheatEngine.Client": "[1.0.0, )",
+ "CheatEngine.Client": "[1.1.0, )",
"ModelContextProtocol": "[2.2.0, )"
}
},
"cheatengine.mcp.hosting": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )",
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )",
"ModelContextProtocol.AspNetCore": "[2.2.0, )"
}
},
"cheatengine.mcp.prompts": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )",
- "CheatEngine.Mcp.Resources": "[2.0.0-beta.3, )"
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )",
+ "CheatEngine.Mcp.Resources": "[2.0.0-beta.4, )"
}
},
"cheatengine.mcp.resources": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )",
- "CheatEngine.Mcp.Tools": "[2.0.0-beta.3, )"
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )",
+ "CheatEngine.Mcp.Tools": "[2.0.0-beta.4, )"
}
},
"cheatengine.mcp.tools": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )"
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )"
}
},
"Microsoft.Extensions.AI.Abstractions": {
diff --git a/srcs/CheatEngine.Mcp.Prompts/packages.lock.json b/srcs/CheatEngine.Mcp.Prompts/packages.lock.json
index 0daca87..209df83 100644
--- a/srcs/CheatEngine.Mcp.Prompts/packages.lock.json
+++ b/srcs/CheatEngine.Mcp.Prompts/packages.lock.json
@@ -10,28 +10,28 @@
},
"CheatEngine.Client.Abstractions": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "1Ma1AEwpAZ2Q6c16ydNzOIsnchanixkH0VgSASOoRoeV+DPtTp98zfi4ZDLat/fkMXxPJNysCGRVRxm5hES+eg==",
+ "resolved": "1.1.0",
+ "contentHash": "CpaOmRG1KJ7f6QxWXowEp8ySvBbb7qTQWB12ulocau35SUYpz9Ug0R52zYoJc+nEeVcQhLCGp/nzuoIJHD9tfg==",
"dependencies": {
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Core": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "MHYLqRPy1NGm8k5uyMB9PnazHwPCyQgs1qUYrei47M0gDUW3yChZJ6N7xrcsng4bJTiqUqIvfOIoPU3MCSr5VA==",
+ "resolved": "1.1.0",
+ "contentHash": "p3Av7agZlLZxr5fvwbW2Uq8TPwOT+PTzs/Hs92zcA8egpQUqyhnAzQOSWPJUNVk+TYDnXWj0nvQwcDMiaEfkTw==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Extensions.DependencyInjection": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "d7zKtwOIkBg7dyXLMP8Z9saHVRj1D82/wg4mAo6ds37ecVylVWzsGusNU2HXiN705pTbs6NRB7k8LEak/KR3Cw==",
+ "resolved": "1.1.0",
+ "contentHash": "ARBq9El8zUijcol/NS/mabxeWHVhPc8flDWQLnEIYoFo9nipLgPwG8SzZT+IckA0BqPtu6LPn3UZDsHReBYqSA==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
- "CheatEngine.Client.Core": "[1.0.0]",
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
+ "CheatEngine.Client.Core": "[1.1.0]",
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12",
"Microsoft.Extensions.DependencyInjection": "10.0.12",
"Microsoft.Extensions.Logging": "10.0.12",
@@ -41,18 +41,18 @@
},
"CheatEngine.Client.Fluent": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "8/4JcuUjaG7iWHgpg6j+nt3r4xSfV5KyjlJ9NlMbX0SWKoRIbTXeUezQjmA0X5XfC76JOmWLBCPuPGbKHv4dmg==",
+ "resolved": "1.1.0",
+ "contentHash": "Q4baX9mQpyuGRO8x1ROOMidejY1o6I9Zkh2uCFEHMIkZK+bdzMas+yQzPyJt80jQUH0InAqCb1tnk4AjELRQZQ==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]"
+ "CheatEngine.Client.Abstractions": "[1.1.0]"
}
},
"CheatEngine.Client.Hosting": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "NxpEXtZ6VN1URhR3mrD6uAqr7Os5zp2y7k45X1+2k0M68XBQC+HIobp9QUBb/q5d2tDgAlZxpHWuS6xhasqJTQ==",
+ "resolved": "1.1.0",
+ "contentHash": "atDiA6dpnP7Mo6dZ9G3XIou8rc2Vc9g5YKvYnps7hwzKP+pY8NUC6O3J8/IiyvN8G0QIZeL7QGSILt8AuCnqIg==",
"dependencies": {
- "CheatEngine.Client.Extensions.DependencyInjection": "[1.0.0]",
+ "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)",
"Microsoft.Extensions.DependencyInjection": "10.0.12",
"Microsoft.Extensions.Logging": "10.0.12"
@@ -162,38 +162,38 @@
"cheatengine.mcp.core": {
"type": "Project",
"dependencies": {
- "CheatEngine.Client": "[1.0.0, )",
+ "CheatEngine.Client": "[1.1.0, )",
"ModelContextProtocol": "[2.2.0, )"
}
},
"cheatengine.mcp.resources": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )",
- "CheatEngine.Mcp.Tools": "[2.0.0-beta.3, )"
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )",
+ "CheatEngine.Mcp.Tools": "[2.0.0-beta.4, )"
}
},
"cheatengine.mcp.tools": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )"
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )"
}
},
"CheatEngine.Client": {
"type": "CentralTransitive",
- "requested": "[1.0.0, )",
- "resolved": "1.0.0",
- "contentHash": "nJ262v9o4Z2QXmG8+Ny5G0V850IYQIdL6GMnugvwPQiqyI3zZgOplU0HBSM+vX1B8k+geTXUFS53IZA03EtigA==",
+ "requested": "[1.1.0, )",
+ "resolved": "1.1.0",
+ "contentHash": "7Gwflxn1fzSMgHFecIhnUwiOHHuM2ysBKa8e0okkr6S/b8Xv821vlGpJHA0LGT8rzhJ8Otbx5PH03//pfgrNVw==",
"dependencies": {
- "CheatEngine.Client.Fluent": "[1.0.0]",
- "CheatEngine.Client.Hosting": "[1.0.0]"
+ "CheatEngine.Client.Fluent": "[1.1.0]",
+ "CheatEngine.Client.Hosting": "[1.1.0]"
}
},
"CheatEngine.SDK": {
"type": "CentralTransitive",
- "requested": "[2.0.0, )",
- "resolved": "2.0.0",
- "contentHash": "NLEdZYJ9LKW3EFNB4X5snKCQf7ZS86GkCQ+El7o+S1XQcxHQGjS45Q1ap8lfjQuIwm004mQ3TPxo+ph1yvRrlQ=="
+ "requested": "[2.0.1, )",
+ "resolved": "2.0.1",
+ "contentHash": "coRWNRz81E5N3PQeruDzHEDSeQQMSYkuCIx9LpKWO3qP61v6hbyRvYlHzjco2iNVykxy9z25zVbivUbxpA5dow=="
},
"Microsoft.Extensions.AI.Abstractions": {
"type": "CentralTransitive",
diff --git a/srcs/CheatEngine.Mcp.Resources/packages.lock.json b/srcs/CheatEngine.Mcp.Resources/packages.lock.json
index 7955de0..fe1f66d 100644
--- a/srcs/CheatEngine.Mcp.Resources/packages.lock.json
+++ b/srcs/CheatEngine.Mcp.Resources/packages.lock.json
@@ -10,28 +10,28 @@
},
"CheatEngine.Client.Abstractions": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "1Ma1AEwpAZ2Q6c16ydNzOIsnchanixkH0VgSASOoRoeV+DPtTp98zfi4ZDLat/fkMXxPJNysCGRVRxm5hES+eg==",
+ "resolved": "1.1.0",
+ "contentHash": "CpaOmRG1KJ7f6QxWXowEp8ySvBbb7qTQWB12ulocau35SUYpz9Ug0R52zYoJc+nEeVcQhLCGp/nzuoIJHD9tfg==",
"dependencies": {
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Core": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "MHYLqRPy1NGm8k5uyMB9PnazHwPCyQgs1qUYrei47M0gDUW3yChZJ6N7xrcsng4bJTiqUqIvfOIoPU3MCSr5VA==",
+ "resolved": "1.1.0",
+ "contentHash": "p3Av7agZlLZxr5fvwbW2Uq8TPwOT+PTzs/Hs92zcA8egpQUqyhnAzQOSWPJUNVk+TYDnXWj0nvQwcDMiaEfkTw==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Extensions.DependencyInjection": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "d7zKtwOIkBg7dyXLMP8Z9saHVRj1D82/wg4mAo6ds37ecVylVWzsGusNU2HXiN705pTbs6NRB7k8LEak/KR3Cw==",
+ "resolved": "1.1.0",
+ "contentHash": "ARBq9El8zUijcol/NS/mabxeWHVhPc8flDWQLnEIYoFo9nipLgPwG8SzZT+IckA0BqPtu6LPn3UZDsHReBYqSA==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
- "CheatEngine.Client.Core": "[1.0.0]",
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
+ "CheatEngine.Client.Core": "[1.1.0]",
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12",
"Microsoft.Extensions.DependencyInjection": "10.0.12",
"Microsoft.Extensions.Logging": "10.0.12",
@@ -41,18 +41,18 @@
},
"CheatEngine.Client.Fluent": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "8/4JcuUjaG7iWHgpg6j+nt3r4xSfV5KyjlJ9NlMbX0SWKoRIbTXeUezQjmA0X5XfC76JOmWLBCPuPGbKHv4dmg==",
+ "resolved": "1.1.0",
+ "contentHash": "Q4baX9mQpyuGRO8x1ROOMidejY1o6I9Zkh2uCFEHMIkZK+bdzMas+yQzPyJt80jQUH0InAqCb1tnk4AjELRQZQ==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]"
+ "CheatEngine.Client.Abstractions": "[1.1.0]"
}
},
"CheatEngine.Client.Hosting": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "NxpEXtZ6VN1URhR3mrD6uAqr7Os5zp2y7k45X1+2k0M68XBQC+HIobp9QUBb/q5d2tDgAlZxpHWuS6xhasqJTQ==",
+ "resolved": "1.1.0",
+ "contentHash": "atDiA6dpnP7Mo6dZ9G3XIou8rc2Vc9g5YKvYnps7hwzKP+pY8NUC6O3J8/IiyvN8G0QIZeL7QGSILt8AuCnqIg==",
"dependencies": {
- "CheatEngine.Client.Extensions.DependencyInjection": "[1.0.0]",
+ "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)",
"Microsoft.Extensions.DependencyInjection": "10.0.12",
"Microsoft.Extensions.Logging": "10.0.12"
@@ -162,31 +162,31 @@
"cheatengine.mcp.core": {
"type": "Project",
"dependencies": {
- "CheatEngine.Client": "[1.0.0, )",
+ "CheatEngine.Client": "[1.1.0, )",
"ModelContextProtocol": "[2.2.0, )"
}
},
"cheatengine.mcp.tools": {
"type": "Project",
"dependencies": {
- "CheatEngine.Mcp.Core": "[2.0.0-beta.3, )"
+ "CheatEngine.Mcp.Core": "[2.0.0-beta.4, )"
}
},
"CheatEngine.Client": {
"type": "CentralTransitive",
- "requested": "[1.0.0, )",
- "resolved": "1.0.0",
- "contentHash": "nJ262v9o4Z2QXmG8+Ny5G0V850IYQIdL6GMnugvwPQiqyI3zZgOplU0HBSM+vX1B8k+geTXUFS53IZA03EtigA==",
+ "requested": "[1.1.0, )",
+ "resolved": "1.1.0",
+ "contentHash": "7Gwflxn1fzSMgHFecIhnUwiOHHuM2ysBKa8e0okkr6S/b8Xv821vlGpJHA0LGT8rzhJ8Otbx5PH03//pfgrNVw==",
"dependencies": {
- "CheatEngine.Client.Fluent": "[1.0.0]",
- "CheatEngine.Client.Hosting": "[1.0.0]"
+ "CheatEngine.Client.Fluent": "[1.1.0]",
+ "CheatEngine.Client.Hosting": "[1.1.0]"
}
},
"CheatEngine.SDK": {
"type": "CentralTransitive",
- "requested": "[2.0.0, )",
- "resolved": "2.0.0",
- "contentHash": "NLEdZYJ9LKW3EFNB4X5snKCQf7ZS86GkCQ+El7o+S1XQcxHQGjS45Q1ap8lfjQuIwm004mQ3TPxo+ph1yvRrlQ=="
+ "requested": "[2.0.1, )",
+ "resolved": "2.0.1",
+ "contentHash": "coRWNRz81E5N3PQeruDzHEDSeQQMSYkuCIx9LpKWO3qP61v6hbyRvYlHzjco2iNVykxy9z25zVbivUbxpA5dow=="
},
"Microsoft.Extensions.AI.Abstractions": {
"type": "CentralTransitive",
diff --git a/srcs/CheatEngine.Mcp.Tools/Code/CodeTools.cs b/srcs/CheatEngine.Mcp.Tools/Code/CodeTools.cs
index 84b6ab6..8840808 100644
--- a/srcs/CheatEngine.Mcp.Tools/Code/CodeTools.cs
+++ b/srcs/CheatEngine.Mcp.Tools/Code/CodeTools.cs
@@ -388,7 +388,7 @@ public CodeComments GetComments(
}
CodeLuaComments comments = _dispatch.RunLua(CheatEngineToolNames.CodeGetComments, CodeScripts.GetComments,
- CodeLuaJsonContext.Default.CodeLuaComments, cancellationToken, expressions);
+ CodeLuaJsonContext.Default.CodeLuaComments, cancellationToken, (object) expressions);
return new CodeComments([
.. comments.Comments.Select(comment => new CodeComment(comment.Address, comment.Comment))
]);
diff --git a/srcs/CheatEngine.Mcp.Tools/Processes/ProcessTools.cs b/srcs/CheatEngine.Mcp.Tools/Processes/ProcessTools.cs
index 5da7588..2739be5 100644
--- a/srcs/CheatEngine.Mcp.Tools/Processes/ProcessTools.cs
+++ b/srcs/CheatEngine.Mcp.Tools/Processes/ProcessTools.cs
@@ -51,7 +51,7 @@ public sealed class ProcessTools
local threads = {}
local maximum = a[1]
for i = 0, math.min(count, maximum) - 1 do
- local threadId = tonumber(list.Strings[i], 16)
+ local threadId = tonumber(list[i], 16)
assert(threadId ~= nil, 'getThreadlist returned an invalid hexadecimal thread id.')
threads[#threads + 1] = threadId
end
diff --git a/srcs/CheatEngine.Mcp.Tools/packages.lock.json b/srcs/CheatEngine.Mcp.Tools/packages.lock.json
index 964bc4b..ce83dd6 100644
--- a/srcs/CheatEngine.Mcp.Tools/packages.lock.json
+++ b/srcs/CheatEngine.Mcp.Tools/packages.lock.json
@@ -10,28 +10,28 @@
},
"CheatEngine.Client.Abstractions": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "1Ma1AEwpAZ2Q6c16ydNzOIsnchanixkH0VgSASOoRoeV+DPtTp98zfi4ZDLat/fkMXxPJNysCGRVRxm5hES+eg==",
+ "resolved": "1.1.0",
+ "contentHash": "CpaOmRG1KJ7f6QxWXowEp8ySvBbb7qTQWB12ulocau35SUYpz9Ug0R52zYoJc+nEeVcQhLCGp/nzuoIJHD9tfg==",
"dependencies": {
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Core": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "MHYLqRPy1NGm8k5uyMB9PnazHwPCyQgs1qUYrei47M0gDUW3yChZJ6N7xrcsng4bJTiqUqIvfOIoPU3MCSr5VA==",
+ "resolved": "1.1.0",
+ "contentHash": "p3Av7agZlLZxr5fvwbW2Uq8TPwOT+PTzs/Hs92zcA8egpQUqyhnAzQOSWPJUNVk+TYDnXWj0nvQwcDMiaEfkTw==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)"
}
},
"CheatEngine.Client.Extensions.DependencyInjection": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "d7zKtwOIkBg7dyXLMP8Z9saHVRj1D82/wg4mAo6ds37ecVylVWzsGusNU2HXiN705pTbs6NRB7k8LEak/KR3Cw==",
+ "resolved": "1.1.0",
+ "contentHash": "ARBq9El8zUijcol/NS/mabxeWHVhPc8flDWQLnEIYoFo9nipLgPwG8SzZT+IckA0BqPtu6LPn3UZDsHReBYqSA==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]",
- "CheatEngine.Client.Core": "[1.0.0]",
+ "CheatEngine.Client.Abstractions": "[1.1.0]",
+ "CheatEngine.Client.Core": "[1.1.0]",
"Microsoft.Extensions.Configuration.Abstractions": "10.0.12",
"Microsoft.Extensions.DependencyInjection": "10.0.12",
"Microsoft.Extensions.Logging": "10.0.12",
@@ -41,18 +41,18 @@
},
"CheatEngine.Client.Fluent": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "8/4JcuUjaG7iWHgpg6j+nt3r4xSfV5KyjlJ9NlMbX0SWKoRIbTXeUezQjmA0X5XfC76JOmWLBCPuPGbKHv4dmg==",
+ "resolved": "1.1.0",
+ "contentHash": "Q4baX9mQpyuGRO8x1ROOMidejY1o6I9Zkh2uCFEHMIkZK+bdzMas+yQzPyJt80jQUH0InAqCb1tnk4AjELRQZQ==",
"dependencies": {
- "CheatEngine.Client.Abstractions": "[1.0.0]"
+ "CheatEngine.Client.Abstractions": "[1.1.0]"
}
},
"CheatEngine.Client.Hosting": {
"type": "Transitive",
- "resolved": "1.0.0",
- "contentHash": "NxpEXtZ6VN1URhR3mrD6uAqr7Os5zp2y7k45X1+2k0M68XBQC+HIobp9QUBb/q5d2tDgAlZxpHWuS6xhasqJTQ==",
+ "resolved": "1.1.0",
+ "contentHash": "atDiA6dpnP7Mo6dZ9G3XIou8rc2Vc9g5YKvYnps7hwzKP+pY8NUC6O3J8/IiyvN8G0QIZeL7QGSILt8AuCnqIg==",
"dependencies": {
- "CheatEngine.Client.Extensions.DependencyInjection": "[1.0.0]",
+ "CheatEngine.Client.Extensions.DependencyInjection": "[1.1.0]",
"CheatEngine.SDK": "[2.0.0, 3.0.0)",
"Microsoft.Extensions.DependencyInjection": "10.0.12",
"Microsoft.Extensions.Logging": "10.0.12"
@@ -162,25 +162,25 @@
"cheatengine.mcp.core": {
"type": "Project",
"dependencies": {
- "CheatEngine.Client": "[1.0.0, )",
+ "CheatEngine.Client": "[1.1.0, )",
"ModelContextProtocol": "[2.2.0, )"
}
},
"CheatEngine.Client": {
"type": "CentralTransitive",
- "requested": "[1.0.0, )",
- "resolved": "1.0.0",
- "contentHash": "nJ262v9o4Z2QXmG8+Ny5G0V850IYQIdL6GMnugvwPQiqyI3zZgOplU0HBSM+vX1B8k+geTXUFS53IZA03EtigA==",
+ "requested": "[1.1.0, )",
+ "resolved": "1.1.0",
+ "contentHash": "7Gwflxn1fzSMgHFecIhnUwiOHHuM2ysBKa8e0okkr6S/b8Xv821vlGpJHA0LGT8rzhJ8Otbx5PH03//pfgrNVw==",
"dependencies": {
- "CheatEngine.Client.Fluent": "[1.0.0]",
- "CheatEngine.Client.Hosting": "[1.0.0]"
+ "CheatEngine.Client.Fluent": "[1.1.0]",
+ "CheatEngine.Client.Hosting": "[1.1.0]"
}
},
"CheatEngine.SDK": {
"type": "CentralTransitive",
- "requested": "[2.0.0, )",
- "resolved": "2.0.0",
- "contentHash": "NLEdZYJ9LKW3EFNB4X5snKCQf7ZS86GkCQ+El7o+S1XQcxHQGjS45Q1ap8lfjQuIwm004mQ3TPxo+ph1yvRrlQ=="
+ "requested": "[2.0.1, )",
+ "resolved": "2.0.1",
+ "contentHash": "coRWNRz81E5N3PQeruDzHEDSeQQMSYkuCIx9LpKWO3qP61v6hbyRvYlHzjco2iNVykxy9z25zVbivUbxpA5dow=="
},
"Microsoft.Extensions.AI.Abstractions": {
"type": "CentralTransitive",
diff --git a/tests/CheatEngine.Mcp.Tests/Contract/AllToolBehaviorEvidenceTests.cs b/tests/CheatEngine.Mcp.Tests/Contract/AllToolBehaviorEvidenceTests.cs
new file mode 100644
index 0000000..f8d098a
--- /dev/null
+++ b/tests/CheatEngine.Mcp.Tests/Contract/AllToolBehaviorEvidenceTests.cs
@@ -0,0 +1,73 @@
+using System.Reflection;
+using System.Text.Json;
+
+using CheatEngine.Mcp.Core.Contract;
+using CheatEngine.Mcp.Tests.Support;
+
+namespace CheatEngine.Mcp.Tests.Contract;
+
+/// New or renamed tools must retain reviewed, executable positive adapter evidence.
+public sealed class AllToolBehaviorEvidenceTests
+{
+ private static readonly Dictionary Evidence = ReadEvidence();
+ private static readonly string[] Suites = ["portable", "nativeLua"];
+
+ public static IEnumerable