From c6727976d8a2740b59c282d5b536c0f5be224874 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Apr 2026 03:02:19 +0000 Subject: [PATCH 01/38] docs: add Mercedes diagnostic tool requirements & plan Session deliverable for branch claude/clarify-project-requirements-Qz5IO. The plan describes a separate personal/workshop Mercedes diagnostic app project; it is unrelated to normalize.css itself and lives here only as a durable record of the session. The actual implementation will happen in its own repository. https://claude.ai/code/session_01Fj9uqsN2XU94g88Y4qLXUa --- docs/mercedes-diag-plan.md | 221 +++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 docs/mercedes-diag-plan.md diff --git a/docs/mercedes-diag-plan.md b/docs/mercedes-diag-plan.md new file mode 100644 index 000000000..58aeae77f --- /dev/null +++ b/docs/mercedes-diag-plan.md @@ -0,0 +1,221 @@ +# Mercedes Diagnostic & Coding Tool — Personal / Workshop Edition + +> **Note:** This document is unrelated to `normalize.css` itself. It was +> produced in a Claude Code session whose harness pinned the working +> branch to this repository; the content is the clarified requirements +> and architecture for a separate desktop application project the user +> is planning. It lives here only as a durable record of that session's +> deliverable. The actual project, when it starts, belongs in its own +> repository. + +## Context + +The user wants a Windows/macOS desktop application for Mercedes-Benz +diagnostics, variant coding, feature activation/deactivation, and "small +coding" — similar in spirit to MBTools, but scoped as a **personal / +workshop internal tool** for cars the user owns or services with the +owner's consent. Not redistributed, not sold. + +This scope was chosen after an earlier discussion ruled out a commercial +clone, because a commercial product would require redistributing Mercedes +proprietary coding artefacts (SMR-D, CBF, .aed) which are Daimler IP. +Personal/workshop use on the user's own machine with files the user +already has is a very different legal situation and is the path we're +taking. + +### Hard out-of-scope (will not implement, even in personal scope) + +- **Anti-theft / VIN-lock write or reset on Audio20 / COMAND / NTG + head units.** The dominant real-world use is reactivating stolen + units; not building this. +- **Redistributing Mercedes proprietary files** (SMR-D, CBF, .aed, + Xentry databases) inside the application binary or installer. + The app reads files the user already has locally. +- **SCN online coding** (requires Mercedes backend credentials and + cryptographic signatures — not feasible anyway). + +### In scope + +- Diagnostics: read/clear DTCs (with human-readable text where + available), live data / PIDs, freeze-frame, actuator/routine tests, + ECU identification, session & security access (seed/key where the + user has the algorithm). +- Small coding and feature enable/disable via writing Data + Identifiers (DIDs) — driven either by user-supplied maps or by + interpreting SMR-D / CBF / .aed files the user loads locally. +- Service functions (service reset, SBC/EPB, DPF regen where + documented, steering-angle calibration, etc.) on ECUs that accept + standard UDS routine controls. +- Target vehicles: both pre-2015 (K-line / CAN, KWP2000 + UDS) and + 2015+ (DoIP over Ethernet). + +## Tech stack (confirmed) + +- **Language/UI:** C# with **Avalonia UI 11** (cross-platform + Windows/macOS/Linux, native feel, modern MVVM via + CommunityToolkit.Mvvm). Rejected .NET MAUI for desktop because + Avalonia is more mature for Windows+macOS desktop today. +- **Runtime:** .NET 8 LTS. +- **DI / logging:** Microsoft.Extensions.Hosting, Serilog. +- **Testing:** xUnit + FluentAssertions; protocol layers tested with + recorded ISO-TP traces. +- **Packaging:** MSIX (Windows) and `.app` bundle via + `dotnet publish -r osx-arm64/osx-x64` with a notarised DMG. + +## Proposed solution architecture + +Layered, with each layer swappable and unit-testable in isolation. + +``` ++---------------------------------------------+ +| UI (Avalonia, MVVM) | MercedesDiag.App ++---------------------------------------------+ +| Application services (coding engine, | MercedesDiag.Services +| session orchestration, job queue) | ++---------------------------------------------+ +| Diagnostic protocol stack | MercedesDiag.Uds +| - UDS (ISO 14229) | MercedesDiag.Kwp +| - KWP2000 (ISO 14230) | +| - OBD-II mode 01-0A | ++---------------------------------------------+ +| Transport layer | MercedesDiag.Transport +| - ISO-TP (ISO 15765-2) over CAN | +| - DoIP (ISO 13400) over TCP/UDP | +| - K-line framing | ++---------------------------------------------+ +| Hardware abstraction (IAdapter) | MercedesDiag.Hal +| - ENET / DoIP (sockets, no driver) | +| - J2534 (P/Invoke into vendor DLL) | +| - PCAN-Basic (P/Invoke) | +| - SocketCAN (Linux only, future) | +| - ELM327 / STN (serial) - for bring-up | +| - C3/C4 MUX in passthrough mode | ++---------------------------------------------+ +``` + +`IAdapter` exposes a raw frame interface (send/receive 11/29-bit CAN +frames, or DoIP payloads). The ISO-TP / DoIP layer sits above and +presents a request/response API to the protocol stack. The protocol +stack never talks to hardware directly. + +### Coding engine + +A separate `MercedesDiag.Coding` assembly with pluggable +`ICodingProvider` implementations: + +1. **UserYamlProvider** — simplest; user writes YAML describing + `ecuName → did → bit/byte → featureName`. This is the "clean" + provider that needs no proprietary formats and is enough for many + everyday coding tasks. Build this first. +2. **AedProvider** — loads `.aed` files the user already has on disk + and exposes their options as a tree. Reader only; no files shipped. +3. **CbfProvider / SmrdProvider** — later milestones. These are + non-trivial (CBF is essentially a compiled ODX variant with its + own VM for seed/key and conversion functions). Start with a + partial reader for common opcodes; extend as real use demands. + +The UI never hard-codes ECU knowledge — it renders whatever the +coding provider produces. + +## Phased delivery + +**M0 — Project skeleton (1–2 days of work)** +- New git repo (a fresh repo e.g. `mercedes-diag`, *not* this one). +- Avalonia solution with the project layout above, CI building on + Windows + macOS, Serilog wired up, xUnit scaffolding. +- A "Hello ECU" screen that does nothing yet. + +**M1 — Talk to one car over ENET (DoIP)** +- Implement DoIP transport (vehicle identification, routing + activation, diagnostic message). +- Implement minimum UDS: `0x10` DiagnosticSessionControl, `0x22` + ReadDataByIdentifier, `0x27` SecurityAccess (no algorithms yet), + `0x19` ReadDTCInformation, `0x14` ClearDiagnosticInformation, + `0x11` ECUReset, `0x31` RoutineControl. +- UI: ECU list, connect, read identification, read DTCs, clear DTCs. +- Verified on a 2015+ Mercedes via OBD-II ENET cable. + +**M2 — Pre-2015 vehicles over CAN** +- PCAN adapter backend (P/Invoke to `PCANBasic.dll` / `libpcan`). +- ISO-TP implementation (single-frame, first-frame/consecutive-frame, + flow-control). +- KWP2000-on-CAN service mapping (many services are UDS-compatible; + a few like `0x1A` need a KWP-specific path). +- J2534 adapter backend (P/Invoke; Windows only for v1). + +**M3 — Live data & coding (read-only first)** +- Periodic DID polling with a graph/gauge view. +- Coding tree UI driven by `UserYamlProvider`. Read current values + and display them; do *not* write yet. +- Ship a small library of hand-written YAML for a few ECUs the user + confirms on their own cars. + +**M4 — Coding writes** +- `0x2E` WriteDataByIdentifier with a mandatory "confirm + backup" + flow: the app always reads and saves current DID values to a JSON + backup file before any write, and offers one-click restore. +- Security access framework: pluggable seed/key algorithms loaded + from user-supplied DLLs or scripts (not shipped). + +**M5 — .aed support** +- Loader for `.aed` files; render their option tree in the coding UI. +- Parity with the YAML provider on write/backup flow. + +**M6 — C3/C4 passthrough and extras** +- Treat the MUX as a CAN/K-line gateway over its network interface + (no proprietary protocol use). +- Optional SMR-D / CBF partial reader — only if real use demands it. + +## Critical files (to be created in the new repo) + +- `src/MercedesDiag.Hal/IAdapter.cs` — hardware abstraction +- `src/MercedesDiag.Hal/Doip/DoipAdapter.cs` +- `src/MercedesDiag.Hal/Pcan/PcanAdapter.cs` +- `src/MercedesDiag.Hal/J2534/J2534Adapter.cs` +- `src/MercedesDiag.Transport/IsoTp/IsoTpChannel.cs` +- `src/MercedesDiag.Transport/Doip/DoipChannel.cs` +- `src/MercedesDiag.Uds/UdsClient.cs` — high-level UDS service API +- `src/MercedesDiag.Coding/ICodingProvider.cs` +- `src/MercedesDiag.Coding/Yaml/UserYamlProvider.cs` +- `src/MercedesDiag.Coding/Aed/AedProvider.cs` +- `src/MercedesDiag.Services/DiagnosticSession.cs` +- `src/MercedesDiag.Services/CodingWriteSafety.cs` — backup & restore +- `src/MercedesDiag.App/` — Avalonia UI (Views, ViewModels) +- `tests/MercedesDiag.Uds.Tests/` — recorded-trace-driven tests +- `docs/SAFETY.md` — out-of-scope items (anti-theft, SCN) restated + in repo so future contributors / future-you don't drift + +## Libraries / tools to evaluate (not committed yet) + +- **Avalonia.ReactiveUI** vs **CommunityToolkit.Mvvm** — pick one. +- **PCAN-Basic.NET** (Peak official binding) for PCAN. +- **Any-J2534 wrappers**: there is no good open binding; we'll + P/Invoke the vendor DLL directly. +- **SharpPcap** — only if we later want to sniff DoIP on a lab PC. +- **YamlDotNet** — coding definitions. +- **MessagePack** — for backup file format. + +## Verification plan + +- **Unit tests**: ISO-TP, DoIP framing, UDS service encode/decode use + recorded binary traces as fixtures. Run in CI on every PR. +- **Integration tests** behind a `[Trait("Hardware","Real")]` gate, + run manually against a real ECU: connect over ENET, read VIN from + `0x22 0xF1 0x90`, read and clear a pending DTC, write-then-restore + a harmless DID (e.g. a user-configurable welcome string on a + non-critical ECU). +- **Safety test**: every write path must refuse to run unless a + backup file for that ECU's coding was written in the same session. + This is itself unit-tested. +- **Manual end-to-end**: on the user's own test vehicle, reproduce + a known coding change (e.g. enable/disable a convenience feature + the user has documented), verify behaviour, then restore. + +## Open items to resolve before starting M0 + +- Repo location: new GitHub repo name (e.g. `mercedes-diag`) and + visibility (private recommended for personal workshop use). +- Which ENET cable / J2534 device / PCAN model the user actually + has on the bench for M1 testing. +- Whether the user wants the UI in English only or multi-language + from day one (Arabic + French were hinted at). From f3e39e7222dd7592b8913b38ea4cf9b0fb0011b2 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Apr 2026 03:13:44 +0000 Subject: [PATCH 02/38] docs: attach Bench Mercedes M0 scaffold bundle The git bundle + tarball contain the M0 Avalonia solution scaffold for the separate Bench-mercedes project. They live here only as a sandbox-crossing delivery channel; see artifacts/README.md for how to import the bundle into the actual repo. https://claude.ai/code/session_01Fj9uqsN2XU94g88Y4qLXUa --- artifacts/README.md | 35 +++++++++++++++++++++++++++++ artifacts/bench-mercedes-m0.bundle | Bin 0 -> 17069 bytes artifacts/bench-mercedes-m0.tar.gz | Bin 0 -> 10700 bytes 3 files changed, 35 insertions(+) create mode 100644 artifacts/README.md create mode 100644 artifacts/bench-mercedes-m0.bundle create mode 100644 artifacts/bench-mercedes-m0.tar.gz diff --git a/artifacts/README.md b/artifacts/README.md new file mode 100644 index 000000000..4caaf50cc --- /dev/null +++ b/artifacts/README.md @@ -0,0 +1,35 @@ +# Session artifacts + +Unrelated to `normalize.css` itself. These files were produced in a +Claude Code session whose harness pinned the working branch to this +repository; they're the deliverables of that session's work on a +separate project and live here only because this was the one repo +the sandbox could push to. + +## `bench-mercedes-m0.bundle` + +A git bundle containing the M0 scaffold commit for the **Bench +Mercedes** project (a personal/workshop Mercedes diagnostic tool). +To import it into an existing empty repo on your machine: + +```bash +# on your own machine, after `gh repo clone rohite1983/Bench-mercedes` +# (or `git clone https://github.com/rohite1983/Bench-mercedes.git`) +cd Bench-mercedes +git pull /path/to/bench-mercedes-m0.bundle main +git push -u origin main +``` + +If the repo is brand new with no `main` yet: + +```bash +git clone /path/to/bench-mercedes-m0.bundle Bench-mercedes +cd Bench-mercedes +git remote add origin https://github.com/rohite1983/Bench-mercedes.git +git push -u origin main +``` + +## `bench-mercedes-m0.tar.gz` + +Same files as a plain tarball, in case the bundle path is awkward. +Extract it, then `git init` / copy the tree into your repo manually. diff --git a/artifacts/bench-mercedes-m0.bundle b/artifacts/bench-mercedes-m0.bundle new file mode 100644 index 0000000000000000000000000000000000000000..e72957013364b8fb60411b16700172579eb7d083 GIT binary patch literal 17069 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 D6ZV_+ literal 0 HcmV?d00001 diff --git a/artifacts/bench-mercedes-m0.tar.gz b/artifacts/bench-mercedes-m0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..205d227c993e952df65e02ee15ff1784d651129a GIT binary patch literal 10700 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 U{{Kv7I{@7Dnu$A%6)enu0WkV+Z~y=R literal 0 HcmV?d00001 From be20f86a8ba7745d01c2c2b893a86aa6c005233c Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Apr 2026 03:17:42 +0000 Subject: [PATCH 03/38] docs: add session state for tomorrow's resume https://claude.ai/code/session_01Fj9uqsN2XU94g88Y4qLXUa --- artifacts/SESSION_STATE.md | 42 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 artifacts/SESSION_STATE.md diff --git a/artifacts/SESSION_STATE.md b/artifacts/SESSION_STATE.md new file mode 100644 index 000000000..0bcf81e4d --- /dev/null +++ b/artifacts/SESSION_STATE.md @@ -0,0 +1,42 @@ +# Session state — resume here tomorrow + +## Where we are + +- **M0 scaffold**: committed and shipped as `bench-mercedes-m0.bundle` + in this `artifacts/` directory. Not yet imported into the + `rohite1983/Bench-mercedes` repo on the user's GitHub. +- **Plan**: `docs/mercedes-diag-plan.md` on this branch. +- **Hard out-of-scope** (do not drift on these): anti-theft/VIN-lock + write on Audio20/COMAND/NTG; redistribution of Mercedes proprietary + files (SMR-D, CBF, .aed); SCN online coding. + +## Next session — first actions + +1. Ask the user: did you import the bundle into `Bench-mercedes` and + run `dotnet restore && dotnet build && dotnet test`? Any errors? +2. If clean, move to **M1**: implement DoIP transport + (`MercedesDiag.Transport/Doip/DoipChannel.cs`, + `MercedesDiag.Hal/Doip/DoipAdapter.cs`) and the minimum UDS + service set (`0x10`, `0x22`, `0x27`, `0x19`, `0x14`, `0x11`, + `0x31`). Wire ECU-list + connect + read-DTCs into the Avalonia + UI. +3. Need to know before M1 starts: which ENET cable / hardware the + user has on the bench. + +## Sandbox / delivery reminder + +- This environment's git auth is scoped to `rohite1983/normalize.css` + only. Cannot push to `Bench-mercedes` directly. Keep using this + branch as the sandbox-crossing channel, or ask the user to expand + scope. +- `dotnet` is not installed in the sandbox — cannot verify builds + here. Changes must be reviewed by the user running `dotnet build` + on their machine. + +## Open questions still unresolved + +- ENET / J2534 / PCAN hardware on the bench. +- UI language(s): English only, or multi-language from day one + (Arabic + French were hinted). +- Whether user wants the Bench-mercedes repo scope added to this + sandbox, or prefers the bundle-handoff workflow. From bac4eb21459d34aca9fa034532e85566d28a0bd8 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Apr 2026 11:40:57 +0000 Subject: [PATCH 04/38] docs: ship M1 bundle (DoIP + UDS + DTC UI) Adds bench-mercedes-m1.bundle (full, 2 commits), bench-mercedes-m0-to-m1.bundle (incremental), and .tar.gz. Updates SESSION_STATE.md with M1 summary and M2 queue. https://claude.ai/code/session_01Fj9uqsN2XU94g88Y4qLXUa --- artifacts/README.md | 47 ++++++++---- artifacts/SESSION_STATE.md | 87 +++++++++++++---------- artifacts/bench-mercedes-m0-to-m1.bundle | Bin 0 -> 16066 bytes artifacts/bench-mercedes-m1.bundle | Bin 0 -> 30758 bytes artifacts/bench-mercedes-m1.tar.gz | Bin 0 -> 18413 bytes 5 files changed, 84 insertions(+), 50 deletions(-) create mode 100644 artifacts/bench-mercedes-m0-to-m1.bundle create mode 100644 artifacts/bench-mercedes-m1.bundle create mode 100644 artifacts/bench-mercedes-m1.tar.gz diff --git a/artifacts/README.md b/artifacts/README.md index 4caaf50cc..9dd16b24a 100644 --- a/artifacts/README.md +++ b/artifacts/README.md @@ -6,30 +6,49 @@ repository; they're the deliverables of that session's work on a separate project and live here only because this was the one repo the sandbox could push to. -## `bench-mercedes-m0.bundle` +## Current state: M1 committed -A git bundle containing the M0 scaffold commit for the **Bench -Mercedes** project (a personal/workshop Mercedes diagnostic tool). -To import it into an existing empty repo on your machine: +- `bench-mercedes-m1.bundle` — **latest, full history (M0 + M1).** + Contains two commits: the M0 scaffold and the M1 DoIP+UDS+DTC work. + This is the file to use if you haven't imported the project yet. +- `bench-mercedes-m0-to-m1.bundle` — incremental, M1 commit only. + Use this if you already imported M0 and want to fetch just the new + commit on top. +- `bench-mercedes-m1.tar.gz` — plain tarball of the M1 tree, in case + the bundle path is awkward. + +### Fresh import (empty Bench-mercedes repo) ```bash -# on your own machine, after `gh repo clone rohite1983/Bench-mercedes` -# (or `git clone https://github.com/rohite1983/Bench-mercedes.git`) +git clone artifacts/bench-mercedes-m1.bundle Bench-mercedes cd Bench-mercedes -git pull /path/to/bench-mercedes-m0.bundle main +git remote add origin https://github.com/rohite1983/Bench-mercedes.git git push -u origin main ``` -If the repo is brand new with no `main` yet: +### Already imported M0, adding M1 ```bash -git clone /path/to/bench-mercedes-m0.bundle Bench-mercedes cd Bench-mercedes -git remote add origin https://github.com/rohite1983/Bench-mercedes.git -git push -u origin main +git pull /path/to/artifacts/bench-mercedes-m0-to-m1.bundle main +git push origin main ``` -## `bench-mercedes-m0.tar.gz` +## Historical + +- `bench-mercedes-m0.bundle` / `bench-mercedes-m0.tar.gz` — the + original M0 scaffold, kept for reference. Prefer the M1 bundles + above. + +## After import: verify on your machine + +```bash +dotnet restore +dotnet build +dotnet test +dotnet run --project src/MercedesDiag.App +``` -Same files as a plain tarball, in case the bundle path is awkward. -Extract it, then `git init` / copy the tree into your repo manually. +You should see the Avalonia window open with connection fields, +an ECU dropdown, and empty DTC grid. If `dotnet build` fails, paste +the errors into the next session and I'll fix them. diff --git a/artifacts/SESSION_STATE.md b/artifacts/SESSION_STATE.md index 0bcf81e4d..e83628a92 100644 --- a/artifacts/SESSION_STATE.md +++ b/artifacts/SESSION_STATE.md @@ -1,42 +1,57 @@ -# Session state — resume here tomorrow +# Session state — resume here next time -## Where we are +## Where we are — M1 shipped -- **M0 scaffold**: committed and shipped as `bench-mercedes-m0.bundle` - in this `artifacts/` directory. Not yet imported into the - `rohite1983/Bench-mercedes` repo on the user's GitHub. +- **M0 scaffold + M1 DoIP/UDS/DTC work**: committed in local scratch + repo at `/tmp/bench-mercedes`, shipped as + `bench-mercedes-m1.bundle` (full) and + `bench-mercedes-m0-to-m1.bundle` (incremental) in this directory. - **Plan**: `docs/mercedes-diag-plan.md` on this branch. -- **Hard out-of-scope** (do not drift on these): anti-theft/VIN-lock - write on Audio20/COMAND/NTG; redistribution of Mercedes proprietary - files (SMR-D, CBF, .aed); SCN online coding. +- **Hard out-of-scope** (do not drift): anti-theft/VIN-lock write on + head units; redistribution of Mercedes proprietary files; SCN. + +## What M1 added + +- DoIP framing + TCP adapter with routing activation, response- + pending handling, AliveCheck auto-reply +- DoIP UDP discovery helper +- UDS: ReadDTC-by-status-mask, ClearDTC, EcuReset, SecurityAccess + seed/key scaffolding, RoutineControl, TesterPresent +- UDS 3-byte DTC parser with 7-char code formatting +- Avalonia UI: IP/port/tester/ECU fields, Connect/Disconnect, + Read/Clear DTCs in DataGrid, VIN display +- Tests: DoIP header encode/decode/invalid-inverse, DTC parsing ## Next session — first actions -1. Ask the user: did you import the bundle into `Bench-mercedes` and - run `dotnet restore && dotnet build && dotnet test`? Any errors? -2. If clean, move to **M1**: implement DoIP transport - (`MercedesDiag.Transport/Doip/DoipChannel.cs`, - `MercedesDiag.Hal/Doip/DoipAdapter.cs`) and the minimum UDS - service set (`0x10`, `0x22`, `0x27`, `0x19`, `0x14`, `0x11`, - `0x31`). Wire ECU-list + connect + read-DTCs into the Avalonia - UI. -3. Need to know before M1 starts: which ENET cable / hardware the - user has on the bench. - -## Sandbox / delivery reminder - -- This environment's git auth is scoped to `rohite1983/normalize.css` - only. Cannot push to `Bench-mercedes` directly. Keep using this - branch as the sandbox-crossing channel, or ask the user to expand - scope. -- `dotnet` is not installed in the sandbox — cannot verify builds - here. Changes must be reviewed by the user running `dotnet build` - on their machine. - -## Open questions still unresolved - -- ENET / J2534 / PCAN hardware on the bench. -- UI language(s): English only, or multi-language from day one - (Arabic + French were hinted). -- Whether user wants the Bench-mercedes repo scope added to this - sandbox, or prefers the bundle-handoff workflow. +1. User imports `bench-mercedes-m1.bundle` into their + `rohite1983/Bench-mercedes` repo on their own machine. +2. User runs `dotnet restore && dotnet build && dotnet test` and + reports any errors — no `dotnet` in sandbox so I couldn't verify. +3. If clean, user plugs ENET cable into a bench car and tries + Connect → Read DTCs. Any runtime failures get diagnosed next + session. +4. Then **M2**: PCAN + ISO-TP for pre-2015 vehicles. + +## Open items + +- Confirm the sandbox scope has been (or will be) expanded to + include `rohite1983/Bench-mercedes`. Until then, keep using the + bundle workflow. +- Sanity-check the default vehicle IP (currently 169.254.0.1) against + what the user's actual ENET cable gets assigned — may need to + switch to DoIP UDP discovery as the primary connect flow. +- UI language: still English-only. Revisit in M2 or M3. + +## Known caveats in M1 that may surface + +- DoIP response-pending handling loops forever inside the timeout + window — fine for normal ECUs, but a broken ECU could hang the + connection. Future: bound the number of pending-loops. +- No flow control yet for ECUs that send multi-segment responses + needing keep-alive — not likely for standard UDS over DoIP but + worth checking against a real target. +- `ReadDtcs` unconditionally enters the extended session; some + ECUs reject this. May need to fall back to default session. +- No security access handshake wired into the UI yet — just APIs + on UdsClient. UI flow for seed/key lands in M4. diff --git a/artifacts/bench-mercedes-m0-to-m1.bundle b/artifacts/bench-mercedes-m0-to-m1.bundle new file mode 100644 index 0000000000000000000000000000000000000000..e0301062cc07ffa4c8e8914a878b77b0eaa4cc5a GIT binary patch literal 16066 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 KtyJyS`u;!9+YY$^ literal 0 HcmV?d00001 diff --git a/artifacts/bench-mercedes-m1.tar.gz b/artifacts/bench-mercedes-m1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..9d7a19c42e1ca2d9c83ec55a2e2d38fd7d41bebc GIT binary patch literal 18413 zcmV)cK&ZbTiwFP!000001MPk5dfPVA@cvz21y$Yw*4T9Wc%z5br}BHk-}ujHEnKoTH9>R?+AQ z3)4NnqNYuQKRtbFK=RP<6JB=y)a*9bo4sCReZ33Mo1JdE`KQZgz$KT)VPpnS zW#Ic!S-wf{vyJ}pe-jEAn>S|QL93E#kr3wr z{pT3!JU1=K89Eox@aXP*=-bY~p#heKiq1XXJ9oT@1_JPINWCSbH`G`x74;d|VgI|L{FC{#%`P_fOsDL@G{y z@bMq_|BWAf8MyvU_zavdNB?&^>#b$~FCgXn-*OC)vrk#ag!#YOYV@-G--U0>`F{b) zGlz7OSkB6d?`^ISG8%_h_(=#%Y@T&R!%gyOXgc0!_R@9PY(~SVAk)gP{zZuIF2;^) z^GqR3_7T0jcpNrF61kj4EQp5@2IaXm}4jsg0!)O?{2~1A&Q$QK?i=-4Fz9|ZlfWITh zG_a^m!+n_cjnMTnAl@L2wE!6PbH&N(Dp&N!&>?^r;NVg-r10GHR|5s1xQ;V;s;vS^ zK4T3Wt5u}Sg&(5M;`zbQbeAj2-z=g0cR-~K==0SvY5mu1=j4C8(d#bd{{qs5ClTaBsQ?0O?Bb8_4A;M0G4}iC zeI`K8uExWQ(6BF-g>L6jnQn*)SN>H@MpU0)>?4} zK>#1I+WDr+ztmps^_$(7O&|n+fgQ1y=?V6LcheL1e^!BeV(=`LkN;+?)63a^JI(fT z{4XLMJ67O_{vaYBop5Zrq#uoK$0vQ?9Wwu#oB0##p%0an1J4$< z%~va~ibAX~`4ZRMDyg|uRP)Q-=F4WIeYo1}9j>o-dcBR+HwWF$Dm*_}-|ZZ(ce_1N zvoex@G+oj7zh|H49vIx#&TxJ62rA8s>serW;m8jnEyl^)g2x){7fR_5cBsW0p64ED zaBY|1+J0(Wf4UiIafRo(2O3;ECAfB;8dsQpVdmDN%U|i9X^`%gAl-dxr290ub}Xvr zi1?-csRs343F^J4Mtygr=M8wCd!WH}y#&|wXBczFnIdTOL+z~Ov5fzokZRLQydRjm z%*vnnXP+|LU^SjF_hj?eiEBonOb$bA!ziF}rjnDl0diwBR`BJl%|vZhJvZF%eGSY2A7&P%mt9ILmTsh%g{-|Fh|3A zfu>j%gDjti=Ah$D04LLN0=W6;I3v($=vY2S&OyhS08Xak1aR}waYmri(6M~}o`a4v z0h~<73E<|Ve1aLAPCxDxejxz$C zhK}XB*Bo@53E*TpP5?I_9cKhuO2?^mz**=x55N*SP6uvAI?e~QgpQNc(RZMF(^!kv zXvEWLVo+>4Th7!v$vhCtXXkk!md{i3KrENo^FS<@UGqRJAH_34oQj_%h~-S7Vdvz* zf6}(*>A~*)@qsb4pRo?c9>x2At!}fO^Z#sjm;3*VNPi`7sApXzjyx+XCo~9s&veNe z!HvD}${&%`?U%6 ziwyG4j{qz?8539z03HRtJ+|OYpHcwv=^wUlg=_uY!-KQG!RYzN=c@Xk#;|ZAIz%)~ zfEG|hb7*={fqMrq{BcD50SU1=q-uJRvkJHjB61TzxjO0Zy{nUe+D;e+&IR9%f&92b zA2<}a7JM_^SPtn6^2JXh6&h z^weX*j#T&kqZ828`srpQ7y9YvlNJm!k(pFMl~`>xnqAiMIYha2cr7k0 z_!lU7?bzsnU;W$e@mpx7VNyF+IJVHP@xmec@MBj5==d0Mvs#^Z8VSt-jqb7#c1H^C z31fdaT4C19Tn8nV%C!~7R;(wnXSv58`>DDLuE>smE0T*|l5dR8c_XfU5#)+2ioB9j zeprDI9zO0!fBz@WSpCS1#vmiU`|h{_jB5@CK4^n56yNzo40|?c#-3ww|Gztmqlw-| zo8-7j{`bHChq1;=6mt#??jhd?WPE@pPw+Uyz@auVFHOe_aUcd1hTy^82jX8NpTb;> zh*{_w0EoemWY~hB0mjApod`5d05&plC*Hl|qw%;=v> z
    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 UGA+|G{U@dW563zeoB#*{05NTAI{*Lx literal 0 HcmV?d00001 From eed9d5c30696678d4f708372bc52cd24adc22396 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Apr 2026 12:02:40 +0000 Subject: [PATCH 05/38] artifacts: ship bench-mercedes M1.1 (.NET 10 upgrade) User's Mac has SDK 10.0.202 and the project was pinned to 8.0.100 via global.json. Rather than have him install an older SDK, upgrade the project to .NET 10 (current LTS). - New full bundle: bench-mercedes-m1.1.bundle (M0+M1+M1.1) - New incremental: bench-mercedes-m1-to-m1.1.bundle (M1.1 on top of M1, for the user's already-pushed Bench-mercedes repo) - README + SESSION_STATE updated with pull-and-push instructions --- artifacts/README.md | 54 +++++++++++------ artifacts/SESSION_STATE.md | 67 ++++++++++++++------- artifacts/bench-mercedes-m1-to-m1.1.bundle | Bin 0 -> 1367 bytes artifacts/bench-mercedes-m1.1.bundle | Bin 0 -> 31748 bytes 4 files changed, 80 insertions(+), 41 deletions(-) create mode 100644 artifacts/bench-mercedes-m1-to-m1.1.bundle create mode 100644 artifacts/bench-mercedes-m1.1.bundle diff --git a/artifacts/README.md b/artifacts/README.md index 9dd16b24a..481e8916b 100644 --- a/artifacts/README.md +++ b/artifacts/README.md @@ -6,39 +6,55 @@ repository; they're the deliverables of that session's work on a separate project and live here only because this was the one repo the sandbox could push to. -## Current state: M1 committed +## Current state: M1.1 committed (.NET 10 upgrade) -- `bench-mercedes-m1.bundle` — **latest, full history (M0 + M1).** - Contains two commits: the M0 scaffold and the M1 DoIP+UDS+DTC work. - This is the file to use if you haven't imported the project yet. -- `bench-mercedes-m0-to-m1.bundle` — incremental, M1 commit only. - Use this if you already imported M0 and want to fetch just the new - commit on top. -- `bench-mercedes-m1.tar.gz` — plain tarball of the M1 tree, in case - the bundle path is awkward. +- `bench-mercedes-m1.1.bundle` — **latest, full history (M0 + M1 + M1.1).** + Three commits: M0 scaffold, M1 DoIP+UDS+DTC work, M1.1 .NET 10 upgrade. + Use this for a fresh import. +- `bench-mercedes-m1-to-m1.1.bundle` — incremental, M1.1 commit only. + Use this if you already pushed M0+M1 to your GitHub repo and just + want to add the upgrade commit. -### Fresh import (empty Bench-mercedes repo) +### Already pushed M0+M1 to GitHub (your case right now) + +From your local `Bench-mercedes` checkout on your Mac: ```bash -git clone artifacts/bench-mercedes-m1.bundle Bench-mercedes -cd Bench-mercedes -git remote add origin https://github.com/rohite1983/Bench-mercedes.git -git push -u origin main +cd ~/path/to/Bench-mercedes +git pull /path/to/artifacts/bench-mercedes-m1-to-m1.1.bundle main +git push origin main ``` -### Already imported M0, adding M1 +Then rerun the build from the repo root: ```bash +dotnet restore +dotnet build +dotnet test +dotnet run --project src/MercedesDiag.App +``` + +The SDK-version error should be gone — the project now targets +`net10.0` and drops the `global.json` pin, so your installed +`10.0.202` SDK will be picked up automatically. + +### Fresh import (empty Bench-mercedes repo) + +```bash +git clone artifacts/bench-mercedes-m1.1.bundle Bench-mercedes cd Bench-mercedes -git pull /path/to/artifacts/bench-mercedes-m0-to-m1.bundle main -git push origin main +git remote set-url origin https://github.com/rohite1983/Bench-mercedes.git +git push -u origin main ``` ## Historical +- `bench-mercedes-m1.bundle` / `bench-mercedes-m1.tar.gz` — M0+M1 + snapshot (pre .NET 10 upgrade). Kept for reference. +- `bench-mercedes-m0-to-m1.bundle` — incremental M1 commit on top + of M0. Kept for reference. - `bench-mercedes-m0.bundle` / `bench-mercedes-m0.tar.gz` — the - original M0 scaffold, kept for reference. Prefer the M1 bundles - above. + original M0 scaffold. Prefer the M1.1 bundles above. ## After import: verify on your machine diff --git a/artifacts/SESSION_STATE.md b/artifacts/SESSION_STATE.md index e83628a92..9f1470985 100644 --- a/artifacts/SESSION_STATE.md +++ b/artifacts/SESSION_STATE.md @@ -1,43 +1,58 @@ # Session state — resume here next time -## Where we are — M1 shipped +## Where we are — M1.1 shipped (.NET 10 upgrade) -- **M0 scaffold + M1 DoIP/UDS/DTC work**: committed in local scratch - repo at `/tmp/bench-mercedes`, shipped as - `bench-mercedes-m1.bundle` (full) and - `bench-mercedes-m0-to-m1.bundle` (incremental) in this directory. +- **M0 scaffold + M1 DoIP/UDS/DTC work + M1.1 .NET 10 upgrade**: + committed in local scratch repo at `/tmp/bench-mercedes`, shipped + as `bench-mercedes-m1.1.bundle` (full) and + `bench-mercedes-m1-to-m1.1.bundle` (incremental) in this directory. +- User successfully pushed M0+M1 commits to + `https://github.com/rohite1983/Bench-mercedes` (private) from his + Mac earlier this session via `gh auth login` + `git push`. - **Plan**: `docs/mercedes-diag-plan.md` on this branch. - **Hard out-of-scope** (do not drift): anti-theft/VIN-lock write on head units; redistribution of Mercedes proprietary files; SCN. -## What M1 added +## What M1.1 added -- DoIP framing + TCP adapter with routing activation, response- - pending handling, AliveCheck auto-reply -- DoIP UDP discovery helper -- UDS: ReadDTC-by-status-mask, ClearDTC, EcuReset, SecurityAccess - seed/key scaffolding, RoutineControl, TesterPresent -- UDS 3-byte DTC parser with 7-char code formatting -- Avalonia UI: IP/port/tester/ECU fields, Connect/Disconnect, - Read/Clear DTCs in DataGrid, VIN display -- Tests: DoIP header encode/decode/invalid-inverse, DTC parsing +- `Directory.Build.props`: `` bumped net8.0 → net10.0, + `` 12 → latest. +- Dropped `global.json` (was pinning SDK 8.0.100, which forced an + older install; user has 10.0.202). +- Package bumps: + - `Microsoft.Extensions.Hosting` 8.0.1 → 10.0.0 + - `Microsoft.Extensions.Logging.Abstractions` 8.0.1 → 10.0.0 + - `Serilog.Extensions.Hosting` 8.0.0 → 9.0.0 + - Test SDK bumps for net10 compat (17.11 → 17.12, xunit 2.9.2 → + 2.9.3, runner 2.8.2 → 3.0.0, FluentAssertions 6.12.1 → 6.12.2). +- Avalonia 11.2.1 and CommunityToolkit.Mvvm 8.3.2 untouched — both + multi-target net10 fine. ## Next session — first actions -1. User imports `bench-mercedes-m1.bundle` into their - `rohite1983/Bench-mercedes` repo on their own machine. -2. User runs `dotnet restore && dotnet build && dotnet test` and - reports any errors — no `dotnet` in sandbox so I couldn't verify. -3. If clean, user plugs ENET cable into a bench car and tries +1. User runs: + ``` + cd ~/path/to/Bench-mercedes + git pull /path/to/artifacts/bench-mercedes-m1-to-m1.1.bundle main + git push origin main + dotnet restore + dotnet build + dotnet test + dotnet run --project src/MercedesDiag.App + ``` + Report any build/test errors — no `dotnet` in sandbox so I can't + verify locally. +2. If clean, user plugs ENET cable into a bench car and tries Connect → Read DTCs. Any runtime failures get diagnosed next session. -4. Then **M2**: PCAN + ISO-TP for pre-2015 vehicles. +3. Then **M2**: PCAN + ISO-TP for pre-2015 vehicles. ## Open items - Confirm the sandbox scope has been (or will be) expanded to include `rohite1983/Bench-mercedes`. Until then, keep using the - bundle workflow. + bundle workflow. User opted for "Expand sandbox scope" earlier + this session; awaiting the admin change on the Claude Code side. - Sanity-check the default vehicle IP (currently 169.254.0.1) against what the user's actual ENET cable gets assigned — may need to switch to DoIP UDP discovery as the primary connect flow. @@ -55,3 +70,11 @@ ECUs reject this. May need to fall back to default session. - No security access handshake wired into the UI yet — just APIs on UdsClient. UI flow for seed/key lands in M4. + +## Sandbox signing note + +Commits in the scratch repo at `/tmp/bench-mercedes` are unsigned +because the sandbox signing server rejects writes from that path +(`missing source`). All three commits (M0, M1, M1.1) follow the +same pattern. Signatures re-applied when the user pushes from his +Mac, so this is cosmetic. diff --git a/artifacts/bench-mercedes-m1-to-m1.1.bundle b/artifacts/bench-mercedes-m1-to-m1.1.bundle new file mode 100644 index 0000000000000000000000000000000000000000..ba102117042d63572a1bce729349ed317d603d32 GIT binary patch literal 1367 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 Date: Tue, 21 Apr 2026 12:09:21 +0000 Subject: [PATCH 06/38] artifacts: ship bench-mercedes M1.2 (NuGet fixes) Tiny follow-up to M1.1: two NuGet errors surfaced on the user's net10 restore. - NU1605 Serilog downgrade: bump direct pin 4.1.0 -> 4.2.0 so Serilog.Extensions.Hosting 9.0.0's transitive requirement is satisfied. - NU1903 Tmds.DBus.Protocol advisory: suppress NU1903 in the App csproj with a comment. The vulnerable package is transitive from Avalonia's Linux DBus integration; we target macOS + Windows so the code path is never loaded. --- artifacts/bench-mercedes-m1.1-to-m1.2.bundle | Bin 0 -> 1132 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m1.1-to-m1.2.bundle diff --git a/artifacts/bench-mercedes-m1.1-to-m1.2.bundle b/artifacts/bench-mercedes-m1.1-to-m1.2.bundle new file mode 100644 index 0000000000000000000000000000000000000000..2bf85260a5b70d886921e462fbd3edc572f5255d GIT binary patch literal 1132 zcmV-y1e5zCAa*h!XK8dGVs&n0Y-I{9G&5ynWH4efV`OGxV=^^3Gh}8qH8e6ZW-?}B zW;8Z8H(@w4GB9H^AWbnYF*+c1aA$I1WMv?9Zy+vCMN}X$FbXy`H#cK2VlibnF*GzZ zFlJ_AVlp>nWim23H#25AWjHu6HD+QtV>BRgWoC0PXk}q!b1!XSX>JM%P(edW00002 z00005nl5;pl~PTU6Cn`2&#&m4hcy&4lVmcxnsQyY^q|qI#PZBQGeH?ZVDjK?Q?!Djr38M@I}1zH$8Moi!xu+8%hN=lu<7NfDghdC=5huNAA z7323nncf~Kee=Cs@&yDTe~BJv${$@H1?j*TePjjvrC`sej4m1P68q#+Hm--3abnF; zP&}Ih+A|UV9?hiV1|x#?+iTSa@M8o;uQEe04n)4`%F*;aMpQRB>>_;(fru^=TV8{v z@$Lqd*oXIHV&9_AUV00hRg(yz4kr0{o)qt11c8ozfX9Qd-Wl;K!Dr*f6HE+XTt;d& zQ%4VQM93ocmdZujo3iDBtVQGuePq0RY$U4150pvSYNWWFDP3-Lf8N9mICLJz!x! zc$@(r0O0?-0=oi`7ZlFH0sAEc%9`ZSZb@g(ro#b4KJl?D5CPwO4Y>XRBwO_)`%sfy zSFwFP(8mAH_`E>>c$}NeG?{5aj>wMPv+rzUdZj2lE7{AqusYCr`nj-)4U+-LDh*Wn z6^y|JpwTFugpHc`HR{X~i*wlZka(O$P)kY!K@erol?ZM;z!L-&nRbjTO$aFBN)quy z*5!1WDVXUF-8~as1UijF%t{ml1Wg+Q8qOH&j|9wC8ax zrhdjsGI9b>9R;yQVO%=|TDU0(4|0r(^6?!GF%hGqL%&lC1-AmZ)r=X10^(t~VTaO^ zW(^8(wFy$O!Y#+75-=~={3q$ud?B;wh{*PGWn+&bvLEXzqARDamO`2ie~E*Uoscub y-Tihs=(i6W9JTlIHQ8QEddv6qujB^{t#6B5kF;DdGCs>ea+a@8dkDkaw$WR`XZ#WX literal 0 HcmV?d00001 From 7d93b8a33375f8a9d655da7fd7be9a41d143065e Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Apr 2026 16:07:47 +0000 Subject: [PATCH 07/38] artifacts: ship bench-mercedes M1.3 (IDE style rule fixes) Follow-up to M1.2. .NET 10's analyzers + TreatWarningsAsErrors=true made IDE0011 (missing braces) and the GenerateDocumentationFile recommendation fatal. Adds braces everywhere, enables doc-file generation (CS1591 already suppressed), removes one unused using. After pulling this, 'dotnet build' and 'dotnet test' should go green on net10. --- artifacts/bench-mercedes-m1.2-to-m1.3.bundle | Bin 0 -> 2075 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m1.2-to-m1.3.bundle diff --git a/artifacts/bench-mercedes-m1.2-to-m1.3.bundle b/artifacts/bench-mercedes-m1.2-to-m1.3.bundle new file mode 100644 index 0000000000000000000000000000000000000000..fc32968004122cdfcc7fea013801ba404b806b7d GIT binary patch literal 2075 zcmV+$2;}!8Aa*h!XK8dGVs&n0Y-I{9HZ?alV=!VdWjHZ3G&C?~W@2J8H)UlqGC4Oh zW;tazI50J4VmV_pAWbnYGCCk;X?P$`bw_1%AYyfCY-Av2VQFl2a%FQMZ*CwiPDNB8 zF)#`>H!)&0Vlg*iH#B88VPZEoVl_E3HZU`0Vr4QiWMnd8WjSIrGh;I#a%E<7FKA_9 zWOFZVVQFp(3Q$2qO8@`>0ssI25t}%8oRw0|a?>ynzUwLW)^=!&9mlnk0fvwS=nToF zg`U^eI?;?Gd9-pvczRZ8;l=?UJfo5J``s9bpy?@Z%93=0I4!WGs;p|=Ov|!rX^y$B z+O96Al^QURi*Q%fb(gmVHN|W;%lp1;5umj_1_%|f2%MFH1G!z>`s2JA$HcVPM()ni1P!P2sacp%s~Y%P5u zM*$H7POQ$87U6l4CK%**Cx6%jK15xZaJ{rn6LI z&GXCdrH-;?%Tc;W5imGuj0b7vCR4uwtKBYv_XB&(7X;quKj~!yBisHL{`=~XpSgIP z0XG21|Ih-^0+5ar5g@m{3K>5DTv#e`9;|8u+&gTAk)nDO42!^w1!snh$VI8%8L?#F z@*+d5lQ01wNi!A~f4ZVm%I}6uUdBA<(3bVY9^CY#OL&~y#=MnzLjWUlNm1$K5XK|` zD%J%X^9FO$rsFv=dLbFpsYiH<#~~k$K#X{t0b>B1|GNUa0+1IJ^Z#gu7c5~45e|%x zm)SI&vs@mikt;5xZz&_pW#=H0U8HdKK#JCR;|4rj*o6IzsX~K4q#hFuzy%&a6nSD*KzuFM9Vd={Htcj;R0MZT)qW%HF8^1p;515!f zgaRu%%K5lkN4~6hoa<%mWt`wEVq5=F>I_5Up`_Iwrk^s?=G*e!e>pKx2LQW04FCHC z;NNR0MU&%jGOjG9H+68gdj0Jqf_ZTA8PMMST~d*0#-GY}^3P$$6A zFXpOvoa<%kWs)~B00IS<{LBJ|?Z!2Jt8HBRr9R)P&i~mY?8+T;e4_k20QzbUyrd9# zoHH~qFf%bxaLLasa7;-oC`m2SOD<-(I*t2VdV#z!2*_CEu9-WmOJ?o2+)VfwArxuiC=I0fI6wll#l6minwOjyY{}Wq(a*3f~dVkEAXju`(w=F(st3 z0IWJ?g2K_Cml^}F^kiX0M&scto{L-&^Kux<`9I$YX^X1^NF#o z$lFkOoBaUN}`OYdKt{^FX5*xK9OLO^ZpN}`UV(k@b+u%U@fj7tFus^KgknB2r>$5=agJDUsW81{A*8s$~4FmWEY=)z3W?m$Y|91rM*M*~5>xYb+c%1vhwuybh zSurjJD5!?BfMBv7qY@{KQ# Date: Tue, 21 Apr 2026 16:09:23 +0000 Subject: [PATCH 08/38] artifacts: ship bench-mercedes M1.4 (final unused-using cleanup) One-liner follow-up: IDE0005 flagged 'using MercedesDiag.Transport' in ConnectionService.cs. Dropped. Build should be green now. --- artifacts/bench-mercedes-m1.3-to-m1.4.bundle | Bin 0 -> 704 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m1.3-to-m1.4.bundle diff --git a/artifacts/bench-mercedes-m1.3-to-m1.4.bundle b/artifacts/bench-mercedes-m1.3-to-m1.4.bundle new file mode 100644 index 0000000000000000000000000000000000000000..5a3af13a4f14153dbef1d786a51eec4a13a80ff2 GIT binary patch literal 704 zcmV;x0zdsDAa*h!XK8dGVs&n0Y-I{9H8(M0HDWP0VK+2oH(_EoH)1t8GBz+XW@2SB zGGt^jVr4mEG&5r}AWbnYGddu1VRUJ8W_chkPDNB8F)$!WL`5KTba`xLAaZqVWpf~D zZXjZHX>4Q)GC4IgV=yx{V>L50Vr4WkWnwZiW-(zlH)1e0V>o1HG&eOjI5amlAaZ49 zb1!IRVPtbJZDDC{3JOp`LrVYv00IC200o>Hc$}4x&q~BF5XSF$iaD+*B~6=6yND>e zf*$syFEB}_Z6HlbnhL(X*%kEQ$;&W*zHjEooW+XBFuiSz7orvJIvxvts+*c2Do!nTryGbKZo)|11rdQTYEC8iA9 z>cR*vl)WL4$u5RBN*~S;W3Q*@vP{C@aU97W{%Ro6K;;L9RyaksJXu^Wth*QV)unO6 zFxczpIAJk+*!|r87Tkf}GK83?3&@b-40$5>B}_497I3C@!E({MR1o}U#l8UR<%?4A z0*~N>KG>=uqvbVyf-_s`pw+x{C3u{>z;uCWgAAj{z2K~t`(<5Q4>ug?Dd69v*ZWd< z!DItQ1px4<4mkb+42!^w1!snh$VI8%8L?#F@*+d5c%0kKw3}(dX_2|+Kl2qA7BVsl z3)laf#a%OvHNaUN}`OYdKt{^FX5*xK6spa mC2&Syg7?NuMh*ZOZUfb8D?s+_k^F5^i literal 0 HcmV?d00001 From 0fe3659a5a8ace587dbcf00b321d657d5af43860 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Apr 2026 16:11:53 +0000 Subject: [PATCH 09/38] artifacts: ship bench-mercedes M1.5 (XAML Grid spacing fix) Avalonia 11.2 Grid doesn't have ColumnSpacing/RowSpacing properties. Replaced with Margin on the grid children. Tests already passing (15/15); this is the last piece before the UI launches. --- artifacts/bench-mercedes-m1.4-to-m1.5.bundle | Bin 0 -> 962 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m1.4-to-m1.5.bundle diff --git a/artifacts/bench-mercedes-m1.4-to-m1.5.bundle b/artifacts/bench-mercedes-m1.4-to-m1.5.bundle new file mode 100644 index 0000000000000000000000000000000000000000..bc1fb64ce85e7cc1dc150fe03b014785119d7923 GIT binary patch literal 962 zcmV;z13mmBAa*h!XK8dGVs&n0Y-I{9GC4IgV=yx{V>L50Vr4WkWnwZiW-(zlH)1e0 zV>o1HG&eOjI5amlAWbnYG&&$;a&K@Tb#8TYWn>^tWpZO>WMy+iX<=tBRB~Z%b8v5R zbRczeX>MmAX>K4xZ*Fd7V{~b6Zc}A)c4=c}3OHglVlX){G%;mmH#TK6G&y55Wj8Tm zWidBmG-hTrGdD0XW;9`8H6U_jW^*rSWnpAHl5D4?G;E=lE`)3YxsK(rEh5-5P6w_^du_kt7_z^ zn!Z%J9Y)c}rWK81xTV<#*jwBNg1yhzXMGL6TCdT50p2vKX`8lF@S)6yX}>HcCHg-X zJMco@!)RXN;Wt|E3r2Q$Eo5uDFJyDe__jh2p9CWOvWbj6N(E>0JR&v|7{zCzED4 zV3@Ky>$8s|*D#XXX&|-uNPw<~Bple|9f6Y6~y|0I<^w0saB=|7eC6EMW=}4vdeN z*)*K9Tpp-+oSV!vnQ6jxkq?}CO;r)`A;(X2KAU^?!&-S~?)ZtXH2~OZ4vDJ;c$_md zFfcPQQSeR7%nQ%VOUW0PO=7?={z!PW)Y*r}=WJ!kCewMKo5JLpC_65C8xG literal 0 HcmV?d00001 From 35e061a62868974788a7ccfe63ce0abe924979f2 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Apr 2026 16:21:27 +0000 Subject: [PATCH 10/38] artifacts: ship bench-mercedes M2.0 (ISO-TP channel) First slice of M2 (pre-2015 CAN support). Pure-logic layer, no hardware dependency - builds and tests anywhere. - IsoTpChannel with full SF/FF/CF + flow-control handling - IsoTpOptions (Mercedes 0xCC padding default) - 6 new unit tests on a fake ICanAdapter covering round-trip, reassembly, TX with FC, timeout, sequence mismatch, empty-payload rejection Total tests after this bundle: 21 (was 15). Next slices (separate bundles): - M2.1: KWP2000 client (pre-2012 Mercedes protocol) - M2.2: PCAN backend scaffolding (runtime needs Windows/Linux) - M2.3: J2534 backend + UI adapter selection (runtime Windows only) --- artifacts/bench-mercedes-m1.5-to-m2.0.bundle | Bin 0 -> 6859 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m1.5-to-m2.0.bundle diff --git a/artifacts/bench-mercedes-m1.5-to-m2.0.bundle b/artifacts/bench-mercedes-m1.5-to-m2.0.bundle new file mode 100644 index 0000000000000000000000000000000000000000..61916c37e82c5e0239fb5def65eaaaaa6641892c GIT binary patch literal 6859 zcmV;+8Z_l2Aa*h!XK8dGVs&n0Y-I{9IAS$oFgY+ZF=b^pHf1w3Ib$?sH!)&mF*jl~ zW@a=qH!v|~G+|*iAWbnYH98<>X?P$(c42I9ZfRj4F)=POAXq_7Odu^FM{;RoAZTH8 zAZ~9ULvL(#ZEi18Z+BC0VPk1-X9_VeGBh$ZHZWl^H#jn7VPrWuV>mWtWM(mBWivT3 zVKX*1I50CeW@8|7WoC0PXk}q!b1!XSX>JM%P(edW000020000Fo?&>Ll~he{<2Dez z>sJiWi;P%_{Her97frNl)F`qsA{W^!MUHIN6seL_9QD_CDA}7udue^JC~7$K=Dj!c z77=EXip>@k7dXqxa=KiK6c_1ik!Ev#cQ?s|C{tSBMh&y5J=~UyGQCUZ6U1zZv-usL zV>T&ql9ltSn$NOyQq37#M6C4(VJv<|Y?Xfnps&@dxJN_s<0|E#SA;?KIT1l7JZv-ZWsUuwsxue1)=g*YMTA zfmv}P!a!hyTA=0~B$P@zkS=Ok`jYXLGs#mdAc}U;$d^Cn)S4%yP03M0GV-F|4V_ zd}wheYc#DV2$t0ZmU#vW_1+&Y^|o9>EH!DOnHsHNn{U8(4Z;=lTsdO2b%469-MJiL z;H29n!@fC2QC-A{}UQcx(H6;$?vK;5yBL z23I*UHElSEm!Odtq`fdW6+0qqDEEV44M7+MufGIfiMO%=H|RY$^wR7V6l;2+2_c3l z{)s#F_4C2K7vcK_X3Rmm0_sjg7)!bn)E~VYNf}| zG$N1Ph9=sF95&3>N4`*mlAeNDNd9$5e4a5l9Z-WdAMlv9WDG|k`I<@%@+W8cYw2p{ z`QZn_6Zld$zJrU|E&g%-awe9>E9_8_6OrpesS0h#>fqx(3D?-KOo5P=g2{dHi8&I2 zSn?rA2D^@~qrU-Y-VA>H1364&HXaH<-vedho@j(yc0d-Ek9eHBz;uCWgAAid$>CW~ zueM&?=qnR4^`i*eN~tJaYZC(?P$)?)E-7Z%!^3a35XMJ(n1pw~$ z81DZ8Y74a&H?FsU>ms*CdLkQQUnE_;c$@(r0O0?-0=oi`{1o_LC~)wV<<9d_&+`2S zjaHr|u@sXK0V@ok4~6~#(QElVOrK34LXJeH3L#zo7}6K3c${0wxRP-~jL5}Z(@O4f zPwn!Jo?6U!y>#0=hbQ?H3oHTCfDRC<3V56|G%zqTF;Va=&JQVY&PdG5OU={@$@9y()s)^Uv&40#BP$I^&IBp@6w$4zF1q)Y)@AM4 z(Z4Rm&pQ6?GXV8jMp(GN1$dmbTI)~S$QJ+3Uol0fa@5oUx_7r12o()Pi?l3UlHR@2 zszQT3CRQCg^^AesH2?cOXCC(W6ßL6At^Z1?D%w#-_AINyY1)I5(Y09V%AKc-T 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 F3O_MLK$-vm literal 0 HcmV?d00001 From e76237e786b0c76fe16fe8a063ee1c3c495ce8bb Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Apr 2026 21:40:55 +0000 Subject: [PATCH 11/38] M1.6: expand Mercedes ECU catalog + custom target address - MercedesEcuCatalog.Common grown from 10 to 27 entries (adds HVAC, SRS, KG, EHPS, HU, COMAND, A20, STH, RSL, SAM-F, SAM-R, IC, PTS, TPM, ISM, EAS, EZS, CGW, DTR, VGS, TCM-9G, DDM, PDM, RDM-R, RDM-L). - MainWindowViewModel: new UseCustomTargetAddress toggle and TargetAddressHex string. ConnectAsync uses the typed hex when the toggle is on, else SelectedEcu.LogicalAddress. - MainWindow.axaml: CheckBox + hex TextBox below the ECU ComboBox; ComboBox disables while custom mode is on so the UI makes it obvious which address will be used. Bundle: artifacts/bench-mercedes-m2.0-to-m1.6.bundle (1024256..a1d6bca). --- artifacts/SESSION_STATE.md | 177 ++++++++++++------- artifacts/bench-mercedes-m2.0-to-m1.6.bundle | Bin 0 -> 2333 bytes 2 files changed, 113 insertions(+), 64 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.0-to-m1.6.bundle diff --git a/artifacts/SESSION_STATE.md b/artifacts/SESSION_STATE.md index 9f1470985..ba2976488 100644 --- a/artifacts/SESSION_STATE.md +++ b/artifacts/SESSION_STATE.md @@ -1,80 +1,129 @@ # Session state — resume here next time -## Where we are — M1.1 shipped (.NET 10 upgrade) - -- **M0 scaffold + M1 DoIP/UDS/DTC work + M1.1 .NET 10 upgrade**: - committed in local scratch repo at `/tmp/bench-mercedes`, shipped - as `bench-mercedes-m1.1.bundle` (full) and - `bench-mercedes-m1-to-m1.1.bundle` (incremental) in this directory. -- User successfully pushed M0+M1 commits to - `https://github.com/rohite1983/Bench-mercedes` (private) from his - Mac earlier this session via `gh auth login` + `git push`. -- **Plan**: `docs/mercedes-diag-plan.md` on this branch. +## Where we are — M2.0 + M1.6 shipped + +- **Scratch repo**: `/tmp/bench-mercedes` (rebuilt each sandbox session + from the latest cumulative bundle — commits are unsigned there, see + signing note at the bottom). +- **Delivery branch on this repo**: `claude/clarify-project-requirements-Qz5IO`. + Each increment lands here as a `bench-mercedes-mX.Y-to-mX.Z.bundle` + in `/artifacts/`. +- **User's real repo**: `https://github.com/rohite1983/Bench-mercedes` + (private) on his Mac at `/Users/mohammedouchrif/Bench-mercedes`. +- **Plan file**: `docs/mercedes-diag-plan.md` on this branch. - **Hard out-of-scope** (do not drift): anti-theft/VIN-lock write on head units; redistribution of Mercedes proprietary files; SCN. -## What M1.1 added - -- `Directory.Build.props`: `` bumped net8.0 → net10.0, - `` 12 → latest. -- Dropped `global.json` (was pinning SDK 8.0.100, which forced an - older install; user has 10.0.202). -- Package bumps: - - `Microsoft.Extensions.Hosting` 8.0.1 → 10.0.0 - - `Microsoft.Extensions.Logging.Abstractions` 8.0.1 → 10.0.0 - - `Serilog.Extensions.Hosting` 8.0.0 → 9.0.0 - - Test SDK bumps for net10 compat (17.11 → 17.12, xunit 2.9.2 → - 2.9.3, runner 2.8.2 → 3.0.0, FluentAssertions 6.12.1 → 6.12.2). -- Avalonia 11.2.1 and CommunityToolkit.Mvvm 8.3.2 untouched — both - multi-target net10 fine. +## Milestone timeline shipped so far + +| Commit | Label | What it did | +|---------|--------|-----------------------------------------------------------| +| 31a4bc6 | M0 | Avalonia solution scaffold | +| 7d6da3b | M1 | DoIP transport + UDS services + DTC UI | +| 43edd0b | M1.1 | Upgrade to .NET 10 | +| 6577c0b | M1.2 | Fix NuGet build failures on .NET 10 | +| 571b5b1 | M1.3 | Satisfy .NET 10 IDE style rules in build | +| 2954c03 | M1.4 | Drop unused MercedesDiag.Transport using | +| 8b5b090 | M1.5 | Fix Avalonia 11.2 XAML (no ColumnSpacing/RowSpacing) | +| 1024256 | M2.0 | ISO-TP (ISO 15765-2) channel implementation | +| a1d6bca | M1.6 | Expand ECU catalog + custom target address | + +## What M2.0 added + +- `src/MercedesDiag.Transport/IsoTp/`: + - `IsoTpChannel.cs` — full ISO 15765-2 single/multi-frame send & + receive with BlockSize / STmin flow-control, background pump, + SemaphoreSlim request gate. + - `IsoTpOptions.cs` — padding byte (default `0xCC` for Mercedes), + block size, STmin, flow-control timeout, frame length. + - `IsoTpPci.cs` — PCI type and flow-status enums + STmin decoder. + - `IsoTpException.cs`. +- `tests/MercedesDiag.Uds.Tests/Fakes/FakeCanAdapter.cs` — + in-memory ICanAdapter with separate tx/rx `Channel`s. +- `tests/MercedesDiag.Uds.Tests/IsoTpChannelTests.cs` — 6 unit tests + covering SF round-trip, FF+CF reassembly, multi-frame send with + FC, timeout, sequence mismatch, empty-payload rejection. +- Expected total after pull: **21 tests passing** (15 existing + 6 new). + +## What M1.6 added + +- `MercedesEcuCatalog.Common` expanded from 10 entries to **27**: + added DDM/PDM/RDM-R/RDM-L, HVAC, SRS, KG, EHPS, HU, COMAND, A20, + STH, RSL, SAM-F, SAM-R, IC, PTS, TPM, ISM, EAS, ESP, VGS, TCM-9G, + DTR, ME, EZS, CGW. +- `MainWindowViewModel.cs`: new `UseCustomTargetAddress` bool and + `TargetAddressHex` string. When toggle is on, `ConnectAsync` + parses the hex field and uses it instead of `SelectedEcu`. + Hex parser accepts `0x`-prefix or bare hex, case-insensitive. +- `MainWindow.axaml`: CheckBox "Custom target address" + TextBox + below the ECU ComboBox; TextBox enabled when toggle is on, and + the ComboBox is disabled when the toggle is on so the UI makes + it obvious which address will be used. ## Next session — first actions -1. User runs: - ``` - cd ~/path/to/Bench-mercedes - git pull /path/to/artifacts/bench-mercedes-m1-to-m1.1.bundle main - git push origin main - dotnet restore - dotnet build - dotnet test - dotnet run --project src/MercedesDiag.App - ``` - Report any build/test errors — no `dotnet` in sandbox so I can't - verify locally. -2. If clean, user plugs ENET cable into a bench car and tries - Connect → Read DTCs. Any runtime failures get diagnosed next - session. -3. Then **M2**: PCAN + ISO-TP for pre-2015 vehicles. +User on his Mac: +``` +cd /Users/mohammedouchrif/Bench-mercedes +git pull ~/normalize.css/artifacts/bench-mercedes-m2.0-to-m1.6.bundle main +git push origin main +dotnet restore +dotnet build +dotnet test +dotnet run --project src/MercedesDiag.App +``` + +Expected after pull: +- 27 ECUs in the dropdown (previously 10). +- A "Custom target address" checkbox + hex textbox below the + dropdown. Ticking it lets him type any logical address in hex. +- 21 tests passing. + +## Next milestone — M2.1 (KWP2000 client) + +- `src/MercedesDiag.Kwp/KwpClient.cs` — ISO 14230 service mapping + for pre-2012 Mercedes over CAN (KWP-on-CAN) — many services are + UDS-compatible but `0x1A` ReadEcuIdentification and a handful of + others need a KWP-specific path. +- Unit tests fed from the existing FakeCanAdapter. +- No UI wiring yet; that lands with M2.3 when the adapter selector + is added. + +## Then — M2.2 (PCAN backend) and M2.3 (J2534) + +- `src/MercedesDiag.Hal/Pcan/PcanAdapter.cs` implementing + `ICanAdapter` via P/Invoke to `PCANBasic.dll` (Windows) / + `libpcan` (Linux). Platform guards so macOS builds but shows + "PCAN driver not available on macOS". +- `src/MercedesDiag.Hal/J2534/J2534Adapter.cs` — P/Invoke to a + vendor J2534 DLL. Windows-only in v1; other platforms compile + a stub that throws `PlatformNotSupportedException`. +- UI: an adapter-selector dropdown (ENET / PCAN / J2534 / C3-C4) + with per-adapter settings panels. ## Open items -- Confirm the sandbox scope has been (or will be) expanded to - include `rohite1983/Bench-mercedes`. Until then, keep using the - bundle workflow. User opted for "Expand sandbox scope" earlier - this session; awaiting the admin change on the Claude Code side. -- Sanity-check the default vehicle IP (currently 169.254.0.1) against - what the user's actual ENET cable gets assigned — may need to - switch to DoIP UDP discovery as the primary connect flow. -- UI language: still English-only. Revisit in M2 or M3. - -## Known caveats in M1 that may surface - -- DoIP response-pending handling loops forever inside the timeout - window — fine for normal ECUs, but a broken ECU could hang the - connection. Future: bound the number of pending-loops. -- No flow control yet for ECUs that send multi-segment responses - needing keep-alive — not likely for standard UDS over DoIP but - worth checking against a real target. -- `ReadDtcs` unconditionally enters the extended session; some - ECUs reject this. May need to fall back to default session. -- No security access handshake wired into the UI yet — just APIs - on UdsClient. UI flow for seed/key lands in M4. +- Sandbox scope for `rohite1983/Bench-mercedes` still not granted, + so the bundle workflow continues. +- Vehicle IP default `169.254.0.1` still unverified against the + user's actual ENET cable — if it doesn't come up, we'll switch + Connect to kick off with DoIP UDP discovery. +- UI language: English only; revisit multi-language in M3. +- User hasn't reported back the actual `dotnet test` output after + pulling M2.0 — the M1.6 bundle will exercise the same tree, so + a single test run after this bundle covers both. + +## Known caveats still unresolved + +- DoIP response-pending handling loops inside the outer timeout + without bounding pending-count. +- `ReadDtcs` unconditionally enters extended session; some ECUs + reject. Will add default-session fallback once we hit one. +- No security-access UI; API exists, UI lands M4. ## Sandbox signing note Commits in the scratch repo at `/tmp/bench-mercedes` are unsigned because the sandbox signing server rejects writes from that path -(`missing source`). All three commits (M0, M1, M1.1) follow the -same pattern. Signatures re-applied when the user pushes from his -Mac, so this is cosmetic. +(`missing source`). Every M0..M2.0..M1.6 commit follows the same +pattern. Signatures re-apply when the user pushes from his Mac. diff --git a/artifacts/bench-mercedes-m2.0-to-m1.6.bundle b/artifacts/bench-mercedes-m2.0-to-m1.6.bundle new file mode 100644 index 0000000000000000000000000000000000000000..c805b333bd637e4d0fb2ac35bdeba93883ed9a6b GIT binary patch literal 2333 zcmV+&3F7u6Aa*h!XK8dGVs&n0Y-I{9F)%VTGBq|ZVKFy2GG$?8IXPoEHf3aHF=S;k zIWb`~Ha0jgGdE^qAWbqZFghSfQ%@~aP#`EtQ%@iD+9 zWo>0{bYXO9Z*B@0ssI23YiahoRyDF3c@fDh4(qd>;*}hG(RFD z6qhbNz;rTIp*50D!Q&gefp78P!S^kmRAwL?txFa$SZz`wG8B2zBW2x>&UG&IcI3qB zjg?;lMt833y+#va$C#TEJ?F_}w#lINK582#Qn<;ZR2XL5GQ&_>9qBjDb0M5hU_xkc z=wpDLZc$X0$VBTAp} z0x|kE{N6XaCT$K-H3v+Y7u~Q2NO+vPz;uCWgAAjH5yRU**=~OxPSfE}k}u+&;%H&I zYO(>N0szn%3()ohbiWH6 z#Xt;O$Zhi;)v6`4@&u79pcLb)X@u;evms05X=*Q4{ELSYqwSI3T)PJv<^BVR>S!P; zLjzPdjbCykgN88){yykHKY4@9YdsSKAW#U) zOf4^FIQ8d|>otKD>qL#e6|Kp<&iyrS>7t3RH2_s39Gd}8zbE3(@?p?Kv)>%hX3o(r1pzMgyJyW+x$i8=tt?G8@!H9ddv8q5HJ z!eXmPHS%d@pFIxW>3E!NQr&73K^P^pbvNS=Z7xbvMJ9{F4ul~}Tcx3fviOq=e;}y} zB04eCbYOQU%*=+w68Z|l^iq6=KzxmQ?M1J>6JNpE%qFI>d$lv)cg}at`DWywRYs@F zdbHx+YH=RI4~e8fA{CFCM0BXyZ?^@NQh!!LHh1$!Eip*&)to*>sngO zxcBr~{-*xnz^%(PQ>my})Z8Nis!0VI!zfi+vgdiF3s7Cl?~K2@o4I^uxeD~XwW9ub z^@;}I8?d*#Z?}f}Hdr5@gH88jVxlWpk0=VIB8q*2ll}g$R4T#ZPR;1*E2}bFV2^|e zwecR$LQWk>vvfaghqW5CaQryxssX}H!6F}312DgFi5o_vl5dzg^1VvmE5pVF74WD_ z1d}|*FGZWhB&>I0E@(g`MH*h;I7vszclR-V|L-9UXMcjKM8uh1JhkRa!#^+?M)+yS zTO?$kjej%aMH02BXsAI*B{l)rbNRvxy$Hk^GDt!*iPqyoj_a|>fRR{bm($Ifu*Sa& zLGCYHdKOiy1$dk@G%zqTF;VbM%*+eV%uC5H*GsHO%*|o=?>ha#iS_;rpS}C$u&k`x zzi`u}Mnmjs^^%JjP8)W{#cnRwG}#-e%q7#ia^fGhRGMoGAUl@% zykpfa&ZdH=c${0Hd`E4A4VRW@v1?vpQch}$tx~m9W?o8WUb=!}XmP4@X>mz@Zb)KL zdTNPdN=i{`@#G2oVv{#;vP`z&@}C^fA*Jq|k(!+ClwYCXoS#>cnpa}01kt2W0@kIF z2-a3S`2ep7NFUHDunrWfu-a5SS&lsTGs2bE=AjCzhlZB%`T53r+L`2hjvTE)@GmJjt(tYT5 zyNB()=jJ0$Gc84lktapTG(*41J=58ZAxB@6nmp`!WLdD1VlEg@aQKL@LE@1kdb`9B z3)zG^07-Hpjr}m4JD|S{q>_|s!IUytwT^qe{nNH#K1JKKPX5oFMxE4!oCeWri>G1S zIgOl$(_Ifisac1M>=r&qa%&Z}QkpK%#VDECw%EncJ)dTBVGr^EIK87BvQ2|57r4A% zd(D}YnsUwxJU%cJARrcb#i`*YN$j`}UcF3Gm>K<5xQVe=Eo@`c*%mtYlB^yWXGE^x zhN4caeUgrA`@Vm2lHruVPzd=Xt>Mr`=pXG8Gn70n3m=;Og9f`0DqeQxthmv;)O;9s zoKE`3FLIak$BWpd!#t_Xh`ikja)~d1Nux$>nyEXg{>VQn)N!>iCl&Ha)%}}W0LNb8W4t(_!a;x*juSGOt#$m-5#Bt6S8*^MLTj2veRET! z(UC Date: Tue, 21 Apr 2026 21:49:20 +0000 Subject: [PATCH 12/38] M2.1 fix: ISO-TP SendIsoTpAsync span-across-await (CS4007) Bundle: artifacts/bench-mercedes-m1.6-to-m2.1fix.bundle (a1d6bca..713d67e). --- artifacts/bench-mercedes-m1.6-to-m2.1fix.bundle | Bin 0 -> 1019 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m1.6-to-m2.1fix.bundle diff --git a/artifacts/bench-mercedes-m1.6-to-m2.1fix.bundle b/artifacts/bench-mercedes-m1.6-to-m2.1fix.bundle new file mode 100644 index 0000000000000000000000000000000000000000..08729f1f1be378b3f79692299d8a3aa9801dbe66 GIT binary patch literal 1019 zcmVcyM8EWFSRDRUl(wbYX07XCNyeV|8 zbRc15WO8M5a|$;xGh{Y5Wo2PvV>MwpGBGzcWny7AWn?osHZ?XeWj8T1Ghs3?W-uUf zWoC0PXk}q!b1!XSX>JM%P(edW0000200006mLzzbm65?t<1i40?|zCof|gcE+N3E$ z2-FkOA`oRCU~G?xRmZmM$+CHSTv`y<^}(9a=%4@lZB9g>`)0jGRdup%1J{*1D4l<;rZN(O9*#mD=>QZFNu7wY^zUQ&B5$;vpp1Ih-`X zE|lv=eKvP4D0H__Z#G?D^>tgruc{oO!Z=!H`ahL;Y?d`#82j(?8V*De9`;X**Jp@0 zyMP)n!waE)@@{^lF{Bw#rI0h=J6g^{?Dp%b+FXOe$WyZZ?Mu4cNAzGl2SE7r2V~%Z zfJ1~}#Gbr<$l*2K=h-V53H@naqD1RTlA!<;`4DU_kM|97Tzn&Erdx4_87Id!IyzGo z*YhHuNlk43(!wMhsc?jN1@D7Z1K2D~NYZLeehGgveUtwt|HcE9DY#Rq22zI-+G|L( zU_2cE^heB4u#WLmh%;o%l;I*D4NIAjZSYqhsVpprem-GdF2x6JX~Kr^0?M;VI;Suh zoWaQN3(WlD}T(Z4%GAzZKUw&(ntT|3T`3oDObo$ zZtRk`c%1tYeldK59+zH8eo11Ef~`V9Vr5Q#Vv3$mYF>IthBcQ06lA6;Xh7B2Di}z z?Ei<h)IeV#3=v( literal 0 HcmV?d00001 From 4f8b17c2de78e1d9a43f86032d7ad5abf2087a2b Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Apr 2026 21:52:24 +0000 Subject: [PATCH 13/38] M2.2 fix: drop unused MercedesDiag.Hal using in IsoTpChannelTests Bundle: artifacts/bench-mercedes-m2.1fix-to-m2.2fix.bundle (713d67e..7c0b04f). --- .../bench-mercedes-m2.1fix-to-m2.2fix.bundle | Bin 0 -> 625 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.1fix-to-m2.2fix.bundle diff --git a/artifacts/bench-mercedes-m2.1fix-to-m2.2fix.bundle b/artifacts/bench-mercedes-m2.1fix-to-m2.2fix.bundle new file mode 100644 index 0000000000000000000000000000000000000000..6514492bb57ecc374df71716ddc578dd915edfd1 GIT binary patch literal 625 zcmV-%0*?J7Aa*h!XK8dGVs&n0Y-I{9H!(A0HaBHuVPa!7VL37}H#TKrVK!xCGdVUj zHZf&4F*7q^GB9Q^AWbqZF(4>rX?Q6*AZul1a3D!jPc2kXAaG%MY;R#?AYpSLQe|Oe zPi|~^O=WFwa(N(OV{&hEb0A@NVQF-83O8dgVlXsjVmLEoH#B57Hf3QkHa9b4I50Oj zHe@(BH#0b9Gd442HXw3kW^*rSWnpA7rd^mlwF|H4%&s{y-nUL*5|Y;=tkX^-2UrTN{E`dUnf+ zxSa(mX^cau7O%KK9)xhgvkfcd4n|0?4G~(WaG8YBWKolsi&k3Do+VB^aE7DbONBMz z@C0kw@!_8Gm5Rgk3BnjX^I1v*2fmNF@_5AF>9rTTOvee{Li~F_gRf?jr{}jVNw440oWv(z-tn-pDN+KT8L#PWU4K( z4tSiqz;uCWgAJp|qBN(XmwFDTBH9ISUlD)h)VGq)69A}R3-h4^c$_ma00ITy)S~3n zl+Dzst*JbVw=3A(HSx`J)DNw}V@x=QD0Me2T zIC_Gx%SIb*w5j62Q+*nXgvH{#RjYWMJEXQsZG!ej=l? Date: Tue, 21 Apr 2026 21:59:31 +0000 Subject: [PATCH 14/38] M2.3: KWP2000 client for pre-2015 Mercedes ECUs - KwpServices / KwpSession / KwpNrc / KwpDtcReportType / KwpEcuIdOptions - KwpDtcRecord with 4-hex-digit Pxxxx / Cxxxx / Bxxxx / Uxxxx formatter - KwpDtcParser tolerates responses with OR without the count byte - KwpClient: session, tester-present (subfn 0x01), ECU ID + VIN, read/write by local & common ID, read & clear DTCs, security seed/key, ECU reset - 11 unit tests via FakeDiagnosticChannel Bundle: artifacts/bench-mercedes-m2.2fix-to-m2.3.bundle (7c0b04f..20881c6). Expected test count after pull: 32 passing (15 M1 + 6 ISO-TP + 11 KWP). --- artifacts/bench-mercedes-m2.2fix-to-m2.3.bundle | Bin 0 -> 6765 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.2fix-to-m2.3.bundle diff --git a/artifacts/bench-mercedes-m2.2fix-to-m2.3.bundle b/artifacts/bench-mercedes-m2.2fix-to-m2.3.bundle new file mode 100644 index 0000000000000000000000000000000000000000..f3d59e6e12ec74179c4f7268cbc35ca197a0d7e2 GIT binary patch literal 6765 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 literal 0 HcmV?d00001 From 7e0c5522df74af20f1d01007893f563f09e61cba Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Apr 2026 22:15:51 +0000 Subject: [PATCH 15/38] Ship bench-mercedes M2.4 bundle: adapter + protocol selector UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Delivers M2.4 (commit 0495c83) on top of M2.3. Sidebar gains Adapter and Protocol dropdowns with conditional per-transport panels: DoIP (IP+port), CAN/PCAN (bitrate+TX+RX+extended+channel), J2534 (DLL path+device), SDconnect (host, not implemented). UDS and KWP sessions now share an IDiagnosticSession abstraction with a protocol-agnostic DtcEntry for the UI. PCAN and J2534 HAL backends still throw on OpenAsync — those land in M2.5 and M2.6. Ready for the user's bench test tomorrow with the ENET cable (DoIP path is unchanged). --- artifacts/SESSION_STATE.md | 148 +++++++++++-------- artifacts/bench-mercedes-m2.3-to-m2.4.bundle | Bin 0 -> 6388 bytes 2 files changed, 83 insertions(+), 65 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.3-to-m2.4.bundle diff --git a/artifacts/SESSION_STATE.md b/artifacts/SESSION_STATE.md index ba2976488..e642a9664 100644 --- a/artifacts/SESSION_STATE.md +++ b/artifacts/SESSION_STATE.md @@ -1,6 +1,6 @@ # Session state — resume here next time -## Where we are — M2.0 + M1.6 shipped +## Where we are — M2.4 shipped (adapter + protocol selector UI) - **Scratch repo**: `/tmp/bench-mercedes` (rebuilt each sandbox session from the latest cumulative bundle — commits are unsigned there, see @@ -27,45 +27,58 @@ | 8b5b090 | M1.5 | Fix Avalonia 11.2 XAML (no ColumnSpacing/RowSpacing) | | 1024256 | M2.0 | ISO-TP (ISO 15765-2) channel implementation | | a1d6bca | M1.6 | Expand ECU catalog + custom target address | - -## What M2.0 added - -- `src/MercedesDiag.Transport/IsoTp/`: - - `IsoTpChannel.cs` — full ISO 15765-2 single/multi-frame send & - receive with BlockSize / STmin flow-control, background pump, - SemaphoreSlim request gate. - - `IsoTpOptions.cs` — padding byte (default `0xCC` for Mercedes), - block size, STmin, flow-control timeout, frame length. - - `IsoTpPci.cs` — PCI type and flow-status enums + STmin decoder. - - `IsoTpException.cs`. -- `tests/MercedesDiag.Uds.Tests/Fakes/FakeCanAdapter.cs` — - in-memory ICanAdapter with separate tx/rx `Channel`s. -- `tests/MercedesDiag.Uds.Tests/IsoTpChannelTests.cs` — 6 unit tests - covering SF round-trip, FF+CF reassembly, multi-frame send with - FC, timeout, sequence mismatch, empty-payload rejection. -- Expected total after pull: **21 tests passing** (15 existing + 6 new). - -## What M1.6 added - -- `MercedesEcuCatalog.Common` expanded from 10 entries to **27**: - added DDM/PDM/RDM-R/RDM-L, HVAC, SRS, KG, EHPS, HU, COMAND, A20, - STH, RSL, SAM-F, SAM-R, IC, PTS, TPM, ISM, EAS, ESP, VGS, TCM-9G, - DTR, ME, EZS, CGW. -- `MainWindowViewModel.cs`: new `UseCustomTargetAddress` bool and - `TargetAddressHex` string. When toggle is on, `ConnectAsync` - parses the hex field and uses it instead of `SelectedEcu`. - Hex parser accepts `0x`-prefix or bare hex, case-insensitive. -- `MainWindow.axaml`: CheckBox "Custom target address" + TextBox - below the ECU ComboBox; TextBox enabled when toggle is on, and - the ComboBox is disabled when the toggle is on so the UI makes - it obvious which address will be used. +| 713d67e | M2.1 | Fix ISO-TP CS4007 (ReadOnlyMemory across awaits) | +| 7c0b04f | M2.2 | Drop unused Hal using in IsoTpChannelTests | +| 20881c6 | M2.3 | KWP2000 client (ISO 14230) + 11 KWP tests | +| 0495c83 | M2.4 | Adapter + protocol selector UI, transport generalization | + +## What M2.4 added + +- **`IDiagnosticSession`** (`src/MercedesDiag.Services/IDiagnosticSession.cs`) + shared contract for UDS and KWP sessions, plus `DtcEntry(Code, Status, Raw)` + record struct that normalises DTCs for the UI. +- **`KwpDiagnosticSession`** — wraps `KwpClient`, enters + `KwpSession.ExtendedDiagnostics` before read/clear, clears group `0xFF00`. +- **`DiagnosticSession`** (UDS) now implements `IDiagnosticSession` and returns + `IReadOnlyList` instead of UDS-specific records. +- **`ConnectionService`** rewritten: + - New enums `AdapterTransport { DoipEnet, Pcan, J2534, Sdconnect }` and + `DiagnosticProtocol { Uds, Kwp }`. + - `ConnectionSettings` is a flat record with nullable per-transport fields: + `DoipEndpoint`, `CanBitrateKbps` (500), `CanTxId` (0x7E0), `CanRxId` + (0x7E8), `CanExtendedFrames`, `PcanChannel` ("PCAN_USBBUS1"), + `J2534DllPath`, `J2534DeviceIndex`, `SdconnectHost`. + - `ConnectAsync` dispatches on transport: DoIP → `DoipChannel`; + PCAN/J2534 → `IsoTpChannel` over the matching CAN adapter; + SDconnect → `NotSupportedException` ("lands in later milestone"). + - Takes three `ILogger` in the ctor (added `KwpDiagnosticSession`). + Generic-host DI resolves it automatically — no `Program.cs` change. +- **`MainWindowViewModel`**: + - `AdapterTransports` and `Protocols` read-only lists for ComboBox binding. + - `SelectedTransport` / `SelectedProtocol` observable properties. + - Derived flags `IsDoipTransport` / `IsCanTransport` / `IsPcanTransport` / + `IsJ2534Transport` / `IsSdconnectTransport` drive panel visibility via + `[NotifyPropertyChangedFor]`. + - New input properties: `CanBitrateKbps`, `CanTxIdHex`, `CanRxIdHex`, + `CanExtendedFrames`, `PcanChannel`, `J2534DllPath`, `J2534DeviceIndex`, + `SdconnectHost`. + - `TryBuildSettings` helper validates per-transport inputs and returns a + human-readable `error` on failure. + - `DtcRowViewModel` now takes `DtcEntry` (protocol-agnostic). +- **`MainWindow.axaml`**: + - Sidebar widened to 360px and wrapped in a `ScrollViewer`. + - Adapter + Protocol ComboBoxes at top. + - Conditional `` sub-panels + for DoIP (IP+port), CAN (bitrate+TX+RX+extended), PCAN (channel + + "hardware backend lands in M2.5"), J2534 (DLL path+device + + "Windows-only"), SDconnect (host + "not implemented yet"). ## Next session — first actions User on his Mac: ``` cd /Users/mohammedouchrif/Bench-mercedes -git pull ~/normalize.css/artifacts/bench-mercedes-m2.0-to-m1.6.bundle main +git pull ~/normalize.css/artifacts/bench-mercedes-m2.3-to-m2.4.bundle main git push origin main dotnet restore dotnet build @@ -73,33 +86,36 @@ dotnet test dotnet run --project src/MercedesDiag.App ``` +(If the Mac is missing the earlier increments, pull them in order first: +`m1.6-to-m2.1fix`, `m2.1fix-to-m2.2fix`, `m2.2fix-to-m2.3`, then this one.) + Expected after pull: -- 27 ECUs in the dropdown (previously 10). -- A "Custom target address" checkbox + hex textbox below the - dropdown. Ticking it lets him type any logical address in hex. -- 21 tests passing. - -## Next milestone — M2.1 (KWP2000 client) - -- `src/MercedesDiag.Kwp/KwpClient.cs` — ISO 14230 service mapping - for pre-2012 Mercedes over CAN (KWP-on-CAN) — many services are - UDS-compatible but `0x1A` ReadEcuIdentification and a handful of - others need a KWP-specific path. -- Unit tests fed from the existing FakeCanAdapter. -- No UI wiring yet; that lands with M2.3 when the adapter selector - is added. - -## Then — M2.2 (PCAN backend) and M2.3 (J2534) - -- `src/MercedesDiag.Hal/Pcan/PcanAdapter.cs` implementing - `ICanAdapter` via P/Invoke to `PCANBasic.dll` (Windows) / - `libpcan` (Linux). Platform guards so macOS builds but shows - "PCAN driver not available on macOS". -- `src/MercedesDiag.Hal/J2534/J2534Adapter.cs` — P/Invoke to a - vendor J2534 DLL. Windows-only in v1; other platforms compile - a stub that throws `PlatformNotSupportedException`. -- UI: an adapter-selector dropdown (ENET / PCAN / J2534 / C3-C4) - with per-adapter settings panels. +- Sidebar now has **Adapter** and **Protocol** dropdowns. +- Selecting a transport reveals that transport's settings panel: + DoIP → IP+port; CAN (PCAN/J2534) → bitrate+TX+RX+extended; PCAN adds + channel; J2534 adds DLL path+device; SDconnect shows "not implemented". +- **32 tests passing** (21 from M2.0/M1.6 + 11 new KWP tests). +- DoIP round-trip still works exactly as before (default values unchanged). + +## Next milestone — M2.5 (PCAN-USB P/Invoke backend) + +Goal: real CAN hardware on Windows/Linux. macOS gets a stub that throws +`PlatformNotSupportedException` — PCAN-USB has no macOS driver. + +- `src/MercedesDiag.Hal/Pcan/PcanAdapter.cs` — replace the throwing stub + with P/Invoke to `PCANBasic.dll` (Windows) / `libpcanbasic.so` (Linux). +- Bitrate mapping (Mercedes buses are almost always 500 kbps; diagnostic + buses on newer cars sometimes 1 Mbps; interior CAN-B 83 kbps). +- Extended-frame + listen-only flags. +- Frame-level tests against a fake channel + manual bench test with a + PCAN-USB on Windows. + +## Then — M2.6 (J2534) and M2.7 (SDconnect passthrough) + +- `src/MercedesDiag.Hal/J2534/J2534Adapter.cs` — P/Invoke to the vendor + DLL selected by `J2534DllPath`. Windows-only in v1. +- SDconnect is complex enough (proprietary MUX protocol over TCP) that it + stays out until a real user need surfaces. ## Open items @@ -109,9 +125,9 @@ Expected after pull: user's actual ENET cable — if it doesn't come up, we'll switch Connect to kick off with DoIP UDP discovery. - UI language: English only; revisit multi-language in M3. -- User hasn't reported back the actual `dotnet test` output after - pulling M2.0 — the M1.6 bundle will exercise the same tree, so - a single test run after this bundle covers both. +- User will test the new UI **tomorrow at the workshop** with the + ENET cable; the bundle covers the UI + protocol plumbing he needs + for that test. ## Known caveats still unresolved @@ -120,10 +136,12 @@ Expected after pull: - `ReadDtcs` unconditionally enters extended session; some ECUs reject. Will add default-session fallback once we hit one. - No security-access UI; API exists, UI lands M4. +- PCAN/J2534 selection in the UI surfaces panels but the HAL backends + still throw "not implemented" on `OpenAsync` — M2.5/M2.6. ## Sandbox signing note Commits in the scratch repo at `/tmp/bench-mercedes` are unsigned because the sandbox signing server rejects writes from that path -(`missing source`). Every M0..M2.0..M1.6 commit follows the same -pattern. Signatures re-apply when the user pushes from his Mac. +(`missing source`). Every M0..M2.4 commit follows the same pattern. +Signatures re-apply when the user pushes from his Mac. diff --git a/artifacts/bench-mercedes-m2.3-to-m2.4.bundle b/artifacts/bench-mercedes-m2.3-to-m2.4.bundle new file mode 100644 index 0000000000000000000000000000000000000000..1a03a65c350b545e8077d83df9ab2c12b56c110e GIT binary patch literal 6388 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 CO+YRH literal 0 HcmV?d00001 From 05635baeae2de28446a38de6ecf2ee06922ef313 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Apr 2026 22:35:33 +0000 Subject: [PATCH 16/38] Ship bench-mercedes M2.5 + M2.6 bundle: ECU auto-discovery + PCAN backend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Delivers M2.5 and M2.6 (commits d290c84 + 033f39e) on top of M2.4. M2.5 — adapter auto-probe + live ECU discovery + UI polish: the sidebar gets a card look with a status dot; after a successful DoIP connect the app now scans known ECU addresses on the real vehicle and replaces the dropdown with only responders (marked with a '•'). Adapter dropdown shows per-platform availability + details (PCAN DLL probe on Win/Linux, macOS reports unavailable). Custom target gains a name field so it shows up as 'My gateway (0x007F)' in the status line. M2.6 — real PCAN-USB P/Invoke backend: Windows (PCANBasic.dll) + Linux (libpcanbasic.so), with a background RX pump into a bounded Channel and platform-guarded entrypoints. macOS throws PlatformNotSupportedException up-front (no PEAK driver). J2534 backend still TBD — that lands in M2.7. Ready for bench testing tomorrow: DoIP path is enhanced (ECU scan), and if the user brings a PCAN-USB to the workshop the CAN path now has a real driver behind it. --- artifacts/SESSION_STATE.md | 167 ++++++++++--------- artifacts/bench-mercedes-m2.4-to-m2.6.bundle | Bin 0 -> 11924 bytes 2 files changed, 88 insertions(+), 79 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.4-to-m2.6.bundle diff --git a/artifacts/SESSION_STATE.md b/artifacts/SESSION_STATE.md index e642a9664..979b60897 100644 --- a/artifacts/SESSION_STATE.md +++ b/artifacts/SESSION_STATE.md @@ -1,6 +1,6 @@ # Session state — resume here next time -## Where we are — M2.4 shipped (adapter + protocol selector UI) +## Where we are — M2.6 shipped (PCAN P/Invoke backend + UI polish) - **Scratch repo**: `/tmp/bench-mercedes` (rebuilt each sandbox session from the latest cumulative bundle — commits are unsigned there, see @@ -31,91 +31,97 @@ | 7c0b04f | M2.2 | Drop unused Hal using in IsoTpChannelTests | | 20881c6 | M2.3 | KWP2000 client (ISO 14230) + 11 KWP tests | | 0495c83 | M2.4 | Adapter + protocol selector UI, transport generalization | - -## What M2.4 added - -- **`IDiagnosticSession`** (`src/MercedesDiag.Services/IDiagnosticSession.cs`) - shared contract for UDS and KWP sessions, plus `DtcEntry(Code, Status, Raw)` - record struct that normalises DTCs for the UI. -- **`KwpDiagnosticSession`** — wraps `KwpClient`, enters - `KwpSession.ExtendedDiagnostics` before read/clear, clears group `0xFF00`. -- **`DiagnosticSession`** (UDS) now implements `IDiagnosticSession` and returns - `IReadOnlyList` instead of UDS-specific records. -- **`ConnectionService`** rewritten: - - New enums `AdapterTransport { DoipEnet, Pcan, J2534, Sdconnect }` and - `DiagnosticProtocol { Uds, Kwp }`. - - `ConnectionSettings` is a flat record with nullable per-transport fields: - `DoipEndpoint`, `CanBitrateKbps` (500), `CanTxId` (0x7E0), `CanRxId` - (0x7E8), `CanExtendedFrames`, `PcanChannel` ("PCAN_USBBUS1"), - `J2534DllPath`, `J2534DeviceIndex`, `SdconnectHost`. - - `ConnectAsync` dispatches on transport: DoIP → `DoipChannel`; - PCAN/J2534 → `IsoTpChannel` over the matching CAN adapter; - SDconnect → `NotSupportedException` ("lands in later milestone"). - - Takes three `ILogger` in the ctor (added `KwpDiagnosticSession`). - Generic-host DI resolves it automatically — no `Program.cs` change. -- **`MainWindowViewModel`**: - - `AdapterTransports` and `Protocols` read-only lists for ComboBox binding. - - `SelectedTransport` / `SelectedProtocol` observable properties. - - Derived flags `IsDoipTransport` / `IsCanTransport` / `IsPcanTransport` / - `IsJ2534Transport` / `IsSdconnectTransport` drive panel visibility via - `[NotifyPropertyChangedFor]`. - - New input properties: `CanBitrateKbps`, `CanTxIdHex`, `CanRxIdHex`, - `CanExtendedFrames`, `PcanChannel`, `J2534DllPath`, `J2534DeviceIndex`, - `SdconnectHost`. - - `TryBuildSettings` helper validates per-transport inputs and returns a - human-readable `error` on failure. - - `DtcRowViewModel` now takes `DtcEntry` (protocol-agnostic). -- **`MainWindow.axaml`**: - - Sidebar widened to 360px and wrapped in a `ScrollViewer`. - - Adapter + Protocol ComboBoxes at top. - - Conditional `` sub-panels - for DoIP (IP+port), CAN (bitrate+TX+RX+extended), PCAN (channel + - "hardware backend lands in M2.5"), J2534 (DLL path+device + - "Windows-only"), SDconnect (host + "not implemented yet"). +| d290c84 | M2.5 | Adapter auto-probe, ECU bus discovery, named custom, UI polish | +| 033f39e | M2.6 | Real PCAN-USB P/Invoke backend (Windows + Linux) | + +## What M2.5 added (UI polish + live ECU discovery) + +- **`AdapterProbeService`** — platform-aware detection of DoIP / PCAN / + J2534 availability. DoIP is always available (host networking). + PCAN checks for `PCANBasic.dll` on Windows (System32) and + `libpcanbasic.so` on Linux (common paths), reports unavailable on + macOS. J2534 reports available only on Windows (user points the DLL + field at a vendor PassThru DLL). +- **`EcuDiscoveryService`** — on a successful DoIP connect, pings each + catalog address with UDS TesterPresent (400 ms per ECU) and replaces + the ECU dropdown with responders. A 'Scan bus' button allows manual + re-scans. Progress bar shown during scan. +- **`MercedesEcu.Source`** (enum: Catalog/Discovered/Custom) — discovered + entries render with a '•' suffix so the user can see which came from + the real car. +- **Named custom target** — users can now give their custom target a + human-readable name (e.g. 'My gateway') alongside the hex address; + it flows through `ConnectionSettings.TargetName` and appears in the + connected status line and future code paths. +- **MainWindow.axaml polish** — card-style sidebar with new styles + (`.card`, `.section`, `.hint`, `.label`), status dot (green connected + / grey disconnected), Re-probe button, inline probe details line, + indeterminate progress bar while connecting, tidier per-transport + panels (DoIP / CAN / PCAN / J2534 / SDconnect). + +## What M2.6 added (PCAN-USB backend) + +- **`src/MercedesDiag.Hal/Pcan/PcanBasic.cs`** — PCANBasic P/Invoke + declarations: `CAN_Initialize` / `_Uninitialize` / `_Read` / `_Write` + with separate Windows (`PCANBasic.dll`) and Linux (`libpcanbasic.so`) + entry points; `TPCANMsg` / `TPCANStatus` / `TPCANMessageType` / + `TPCANTimestamp` structs; bitrate constants (`B500K`, `B1M`, etc.) + and `PcanBaud.FromKbps` mapper; channel map for + `PCAN_USBBUS1..8` / `PCIBUS` / `ISABUS`. +- **`PcanAdapter.cs`** — replaces the 'not implemented' stub with a + full `ICanAdapter` over PCAN. Background RX pump runs in a Task, + writes into a bounded `Channel` (DropOldest on overflow); + TX goes through `CAN_Write` with 11/29-bit flag set from `CanFrame.Extended`. + macOS path throws `PlatformNotSupportedException` up-front (no PEAK driver). ## Next session — first actions User on his Mac: ``` +cd ~/normalize.css && git pull origin claude/clarify-project-requirements-Qz5IO cd /Users/mohammedouchrif/Bench-mercedes git pull ~/normalize.css/artifacts/bench-mercedes-m2.3-to-m2.4.bundle main +git pull ~/normalize.css/artifacts/bench-mercedes-m2.4-to-m2.6.bundle main git push origin main -dotnet restore -dotnet build -dotnet test +dotnet restore && dotnet build && dotnet test dotnet run --project src/MercedesDiag.App ``` -(If the Mac is missing the earlier increments, pull them in order first: -`m1.6-to-m2.1fix`, `m2.1fix-to-m2.2fix`, `m2.2fix-to-m2.3`, then this one.) +(If the Mac is behind M2.3, pull the earlier bundles first in order: +`m1.6-to-m2.1fix`, `m2.1fix-to-m2.2fix`, `m2.2fix-to-m2.3`, then the +two newest.) Expected after pull: -- Sidebar now has **Adapter** and **Protocol** dropdowns. -- Selecting a transport reveals that transport's settings panel: - DoIP → IP+port; CAN (PCAN/J2534) → bitrate+TX+RX+extended; PCAN adds - channel; J2534 adds DLL path+device; SDconnect shows "not implemented". -- **32 tests passing** (21 from M2.0/M1.6 + 11 new KWP tests). -- DoIP round-trip still works exactly as before (default values unchanged). - -## Next milestone — M2.5 (PCAN-USB P/Invoke backend) - -Goal: real CAN hardware on Windows/Linux. macOS gets a stub that throws -`PlatformNotSupportedException` — PCAN-USB has no macOS driver. - -- `src/MercedesDiag.Hal/Pcan/PcanAdapter.cs` — replace the throwing stub - with P/Invoke to `PCANBasic.dll` (Windows) / `libpcanbasic.so` (Linux). -- Bitrate mapping (Mercedes buses are almost always 500 kbps; diagnostic - buses on newer cars sometimes 1 Mbps; interior CAN-B 83 kbps). -- Extended-frame + listen-only flags. -- Frame-level tests against a fake channel + manual bench test with a - PCAN-USB on Windows. - -## Then — M2.6 (J2534) and M2.7 (SDconnect passthrough) - -- `src/MercedesDiag.Hal/J2534/J2534Adapter.cs` — P/Invoke to the vendor - DLL selected by `J2534DllPath`. Windows-only in v1. -- SDconnect is complex enough (proprietary MUX protocol over TCP) that it - stays out until a real user need surfaces. +- Sidebar has a cleaner card look with a green/grey status dot in the + header. +- Adapter dropdown shows availability + helpful detail for each transport. + A 'Re-probe' button re-checks (useful after plugging in PCAN-USB). +- Connect button shows an indeterminate progress bar while connecting. +- After connecting via DoIP, the app auto-scans known ECU addresses + against the real vehicle; dropdown shrinks to only responders with + a '•' marker. A 'Scan bus' button lets you repeat the scan. +- 'Custom target' panel now has a name + address side-by-side. +- PCAN hardware on Windows/Linux: selecting Pcan, entering channel + (e.g. `PCAN_USBBUS1`) + bitrate + tester/ECU CAN IDs, then Connect + should now actually initialise the driver and send frames. +- 32 tests still passing (no new tests in M2.5/M2.6 — the new services + need integration tests with real hardware; unit coverage lands later). + +## Next milestone — M2.7 (J2534 P/Invoke backend) + +- `src/MercedesDiag.Hal/J2534/J2534Adapter.cs` — real P/Invoke to the + vendor DLL specified by `J2534DllPath`. Windows-only in v1. +- J2534 API: `PassThruOpen`, `PassThruConnect`, `PassThruReadMsgs`, + `PassThruWriteMsgs`, `PassThruIoctl`, `PassThruDisconnect`, `PassThruClose`. +- The existing `J2534Adapter.cs` still throws 'not implemented'; this + milestone replaces it analogously to M2.6's PcanAdapter. + +## Then — M3 (live data + coding) + +- `src/MercedesDiag.Coding/Yaml/UserYamlProvider.cs` — user-supplied + YAML coding definitions. +- Periodic DID polling with graph/gauge. +- Coding tree UI. ## Open items @@ -125,9 +131,10 @@ Goal: real CAN hardware on Windows/Linux. macOS gets a stub that throws user's actual ENET cable — if it doesn't come up, we'll switch Connect to kick off with DoIP UDP discovery. - UI language: English only; revisit multi-language in M3. -- User will test the new UI **tomorrow at the workshop** with the - ENET cable; the bundle covers the UI + protocol plumbing he needs - for that test. +- No unit tests for AdapterProbeService / EcuDiscoveryService / the + real PcanAdapter yet — they benefit most from hardware integration + tests. Fake-driven unit tests can still be added for ProbeService + branches on demand. ## Known caveats still unresolved @@ -136,12 +143,14 @@ Goal: real CAN hardware on Windows/Linux. macOS gets a stub that throws - `ReadDtcs` unconditionally enters extended session; some ECUs reject. Will add default-session fallback once we hit one. - No security-access UI; API exists, UI lands M4. -- PCAN/J2534 selection in the UI surfaces panels but the HAL backends - still throw "not implemented" on `OpenAsync` — M2.5/M2.6. +- J2534 selection in the UI now flows to a stub that throws on open. + Real implementation in M2.7. +- SDconnect remains unimplemented and will stay so until a real + user need surfaces. ## Sandbox signing note Commits in the scratch repo at `/tmp/bench-mercedes` are unsigned because the sandbox signing server rejects writes from that path -(`missing source`). Every M0..M2.4 commit follows the same pattern. +(`missing source`). Every M0..M2.6 commit follows the same pattern. Signatures re-apply when the user pushes from his Mac. diff --git a/artifacts/bench-mercedes-m2.4-to-m2.6.bundle b/artifacts/bench-mercedes-m2.4-to-m2.6.bundle new file mode 100644 index 0000000000000000000000000000000000000000..7f1dbef1c2ef15d8e2d128c1a13acec24c6e1480 GIT binary patch literal 11924 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 literal 0 HcmV?d00001 From 85d411b297416fed063eb604e0e7acddd831a6bc Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 21 Apr 2026 22:37:25 +0000 Subject: [PATCH 17/38] Ship M2.6 fix bundle: add missing using for IDoipAdapter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One-line fix for CS0246 in MainWindowViewModel.cs — the DiscoverEcusAsync method casts the connected adapter to IDoipAdapter, which lives in MercedesDiag.Hal, not MercedesDiag.Hal.Doip. Apply on top of the M2.4→M2.6 bundle. --- artifacts/bench-mercedes-m2.6-to-m2.6fix.bundle | Bin 0 -> 830 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.6-to-m2.6fix.bundle diff --git a/artifacts/bench-mercedes-m2.6-to-m2.6fix.bundle b/artifacts/bench-mercedes-m2.6-to-m2.6fix.bundle new file mode 100644 index 0000000000000000000000000000000000000000..6184dd0930d6de8589ab8c711052cea1125a0791 GIT binary patch literal 830 zcmV-E1Ht?wAa*h!XK8dGVs&n0Y-I{9Ff%h|GdX2BG&5m0IASm{Ffuh|GiEtrH)J$6 zH8wb8H)UdCVKFi=AWbqZHaZ}3WnpX}P(wjZEmc!OAW$z!Zgy{LWgucMe1cXJ>sAWUg)b$BTXGBPnRH8nM1IALO9HZV9fFfd^;VmUWBH8Nx}I59G0W-??k zW@I>IAaZ49b1!IRVPtbJZDDC{3JOp`LrVYv00IC200xvHc$}4x%TB~F3`O_(3hxF4 zRBh8IAOy@H!D3beAK)g=G*X*XNjd|6Pg_9ZvBC>mmgRe|PH;p}t6Wi@a>AUK8Kp@f zc-1sTnx!g9N?vn}Gm$Gcpd%9?=3Mcb>WpJqHE|NBIdN4trOb-FsANe^gGm}Q97Agz ztUDYf!P-vkS}e>T|BH`JPa6G5a@%SQW!%b zXlr)l4q8z3`3J%N)H$|Vw9x4TdC&&Jr0T2}s7834+s(9_X@a=O zy(Q82Bq~+ZLj*c|eV?)RHb!a%ZPXTE1OUNa3s3$5n4KHL%rNBne+2`oEL4y;w{dkV zc$@(q0O9|W0+Rxew-huoa<%mWt`wE!ti9e{;^};wJX1GcAfV;zF>8r%9e?VIsnXg4eEMs zyl+|`x5jj}M678er(Gu;4@KR0oLf Date: Tue, 21 Apr 2026 22:52:50 +0000 Subject: [PATCH 18/38] M2.7+M2.8: DoIP auto-detect + Advanced expander + real J2534 backend - M2.7 (932e9ba): 'Detect vehicle' broadcasts a DoIP UDP VehicleIdentificationRequest and auto-fills the vehicle IP/port and VIN from the car's announcement. All manual plumbing fields (IP, port, tester/ECU addresses, CAN bitrate, PCAN channel, CAN TX/RX IDs, J2534 DLL path, SDconnect host) move into a collapsed 'Advanced (manual overrides)' expander. Default sidebar shows a single TransportSummary line instead. - M2.8 (4bfe0f8): Replaces the throwing J2534Adapter stub with a real ICanAdapter over the SAE J2534 PassThru API. User-supplied DLL path is loaded at runtime via NativeLibrary.Load + Marshal.GetDelegateForFunctionPointer for StdCall bindings. On open, connects a raw-CAN channel at the requested bitrate, installs a pass-all filter, and pumps into a bounded Channel. Windows-only. Updates SESSION_STATE.md with the M2.6fix..M2.8 history and adds bundle bench-mercedes-m2.6fix-to-m2.8.bundle. --- artifacts/SESSION_STATE.md | 177 +++++++++--------- .../bench-mercedes-m2.6fix-to-m2.8.bundle | Bin 0 -> 7755 bytes 2 files changed, 92 insertions(+), 85 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.6fix-to-m2.8.bundle diff --git a/artifacts/SESSION_STATE.md b/artifacts/SESSION_STATE.md index 979b60897..3ae8765fe 100644 --- a/artifacts/SESSION_STATE.md +++ b/artifacts/SESSION_STATE.md @@ -1,6 +1,6 @@ # Session state — resume here next time -## Where we are — M2.6 shipped (PCAN P/Invoke backend + UI polish) +## Where we are — M2.8 shipped (real J2534 backend + auto DoIP discovery + UI hides transport details) - **Scratch repo**: `/tmp/bench-mercedes` (rebuilt each sandbox session from the latest cumulative bundle — commits are unsigned there, see @@ -33,46 +33,52 @@ | 0495c83 | M2.4 | Adapter + protocol selector UI, transport generalization | | d290c84 | M2.5 | Adapter auto-probe, ECU bus discovery, named custom, UI polish | | 033f39e | M2.6 | Real PCAN-USB P/Invoke backend (Windows + Linux) | - -## What M2.5 added (UI polish + live ECU discovery) - -- **`AdapterProbeService`** — platform-aware detection of DoIP / PCAN / - J2534 availability. DoIP is always available (host networking). - PCAN checks for `PCANBasic.dll` on Windows (System32) and - `libpcanbasic.so` on Linux (common paths), reports unavailable on - macOS. J2534 reports available only on Windows (user points the DLL - field at a vendor PassThru DLL). -- **`EcuDiscoveryService`** — on a successful DoIP connect, pings each - catalog address with UDS TesterPresent (400 ms per ECU) and replaces - the ECU dropdown with responders. A 'Scan bus' button allows manual - re-scans. Progress bar shown during scan. -- **`MercedesEcu.Source`** (enum: Catalog/Discovered/Custom) — discovered - entries render with a '•' suffix so the user can see which came from - the real car. -- **Named custom target** — users can now give their custom target a - human-readable name (e.g. 'My gateway') alongside the hex address; - it flows through `ConnectionSettings.TargetName` and appears in the - connected status line and future code paths. -- **MainWindow.axaml polish** — card-style sidebar with new styles - (`.card`, `.section`, `.hint`, `.label`), status dot (green connected - / grey disconnected), Re-probe button, inline probe details line, - indeterminate progress bar while connecting, tidier per-transport - panels (DoIP / CAN / PCAN / J2534 / SDconnect). - -## What M2.6 added (PCAN-USB backend) - -- **`src/MercedesDiag.Hal/Pcan/PcanBasic.cs`** — PCANBasic P/Invoke - declarations: `CAN_Initialize` / `_Uninitialize` / `_Read` / `_Write` - with separate Windows (`PCANBasic.dll`) and Linux (`libpcanbasic.so`) - entry points; `TPCANMsg` / `TPCANStatus` / `TPCANMessageType` / - `TPCANTimestamp` structs; bitrate constants (`B500K`, `B1M`, etc.) - and `PcanBaud.FromKbps` mapper; channel map for - `PCAN_USBBUS1..8` / `PCIBUS` / `ISABUS`. -- **`PcanAdapter.cs`** — replaces the 'not implemented' stub with a - full `ICanAdapter` over PCAN. Background RX pump runs in a Task, - writes into a bounded `Channel` (DropOldest on overflow); - TX goes through `CAN_Write` with 11/29-bit flag set from `CanFrame.Extended`. - macOS path throws `PlatformNotSupportedException` up-front (no PEAK driver). +| 2210555 | M2.6f | Fix CS0246 missing `using MercedesDiag.Hal` for IDoipAdapter | +| 932e9ba | M2.7 | Auto-detect DoIP vehicle + hide transport details behind Advanced expander | +| 4bfe0f8 | M2.8 | Real J2534 P/Invoke backend (Windows-only) | + +## What M2.7 added (UI simplification + DoIP auto-discovery) + +- **DoIP vehicle detect** — a 'Detect vehicle' button (visible only for + DoIP transport) calls `DoipDiscovery.DiscoverAsync` which broadcasts + a UDP VehicleIdentificationRequest and waits 3 s for a + VehicleAnnouncement. On success the vehicle IP/port and VIN are + auto-populated into the settings fields; a small `DetectedVin` line + shows under the transport summary. +- **Advanced expander** — all the 'inner plumbing' fields (vehicle IP, + DoIP port, logical tester/ECU addresses, CAN bitrate, PCAN channel, + CAN TX/RX IDs, J2534 DLL path, SDconnect host) moved inside an + `` that starts + collapsed. The default view now shows only: Adapter → Re-probe → + one-line `TransportSummary` → Detect button (DoIP) → Protocol → + Target ECU + Scan bus → Custom target → Connect → VIN. +- **`TransportSummary` computed property** in MainWindowViewModel with + `[NotifyPropertyChangedFor]` on every transport field so the summary + auto-refreshes when the user tweaks Advanced. + +## What M2.8 added (J2534 PassThru backend) + +- **`src/MercedesDiag.Hal/J2534/J2534Native.cs`** — J2534 P/Invoke + layer. Because the DLL path is user-supplied at runtime, + `[DllImport("…")]` won't work; instead `J2534Library` loads the DLL + with `NativeLibrary.Load(dllPath)` and binds each PassThru function + via `NativeLibrary.GetExport` + `Marshal.GetDelegateForFunctionPointer` + against `[UnmanagedFunctionPointer(CallingConvention.StdCall)]` + delegates: `PassThruOpen/Close/Connect/Disconnect/ReadMsgs/WriteMsgs/ + StartMsgFilter/StopMsgFilter/Ioctl/GetLastError`. Includes the + `PassThruMsg` struct (4128-byte inline `Data` via ByValArray), + protocol/flag/ioctl/filter-type enums, and + `J2534Errors.Describe(code)` mapping 0x00..0x1A to SAE-spec names. +- **`J2534Adapter.cs`** — replaces the throwing stub with a full + `ICanAdapter`. `OpenAsync` guards Windows-only, loads the DLL, calls + `PassThruOpen` → `PassThruConnect` on `Can` protocol at + `BitrateKbps*1000`, installs a pass-all filter (required before RX + flows), and starts a background pump reading into a bounded + `Channel(2048)` (DropOldest). `SendAsync` maps `CanFrame` + → `PassThruMsg` with the 29-bit TX flag and 4-byte big-endian ID + prefix. `CloseAsync` tears filter → channel → device down in order + and disposes the library. macOS/Linux throw `PlatformNotSupported` + up-front (no free PassThru DLLs outside Windows). ## Next session — first actions @@ -80,61 +86,62 @@ User on his Mac: ``` cd ~/normalize.css && git pull origin claude/clarify-project-requirements-Qz5IO cd /Users/mohammedouchrif/Bench-mercedes -git pull ~/normalize.css/artifacts/bench-mercedes-m2.3-to-m2.4.bundle main -git pull ~/normalize.css/artifacts/bench-mercedes-m2.4-to-m2.6.bundle main +git pull ~/normalize.css/artifacts/bench-mercedes-m2.6fix-to-m2.8.bundle main git push origin main dotnet restore && dotnet build && dotnet test dotnet run --project src/MercedesDiag.App ``` -(If the Mac is behind M2.3, pull the earlier bundles first in order: -`m1.6-to-m2.1fix`, `m2.1fix-to-m2.2fix`, `m2.2fix-to-m2.3`, then the -two newest.) +(If the Mac is behind M2.6fix, pull the earlier bundles first in +order: `m2.3-to-m2.4`, `m2.4-to-m2.6`, `m2.6-to-m2.6fix`, then this +newest one.) Expected after pull: -- Sidebar has a cleaner card look with a green/grey status dot in the - header. -- Adapter dropdown shows availability + helpful detail for each transport. - A 'Re-probe' button re-checks (useful after plugging in PCAN-USB). -- Connect button shows an indeterminate progress bar while connecting. -- After connecting via DoIP, the app auto-scans known ECU addresses - against the real vehicle; dropdown shrinks to only responders with - a '•' marker. A 'Scan bus' button lets you repeat the scan. -- 'Custom target' panel now has a name + address side-by-side. -- PCAN hardware on Windows/Linux: selecting Pcan, entering channel - (e.g. `PCAN_USBBUS1`) + bitrate + tester/ECU CAN IDs, then Connect - should now actually initialise the driver and send frames. -- 32 tests still passing (no new tests in M2.5/M2.6 — the new services - need integration tests with real hardware; unit coverage lands later). - -## Next milestone — M2.7 (J2534 P/Invoke backend) - -- `src/MercedesDiag.Hal/J2534/J2534Adapter.cs` — real P/Invoke to the - vendor DLL specified by `J2534DllPath`. Windows-only in v1. -- J2534 API: `PassThruOpen`, `PassThruConnect`, `PassThruReadMsgs`, - `PassThruWriteMsgs`, `PassThruIoctl`, `PassThruDisconnect`, `PassThruClose`. -- The existing `J2534Adapter.cs` still throws 'not implemented'; this - milestone replaces it analogously to M2.6's PcanAdapter. - -## Then — M3 (live data + coding) +- The top of the sidebar is much cleaner: Adapter → Re-probe → single + monospace `TransportSummary` line → Detect button (DoIP only) → + Protocol → Target ECU → Connect. +- 'Detect vehicle' (DoIP) broadcasts a VIR, populates the vehicle + IP/port and VIN from the car's announcement within ~3 s. +- All IP/port/CAN/PCAN/J2534 fine-tuning lives in the collapsed + 'Advanced (manual overrides)' expander. +- J2534: pointing the Advanced-expander 'J2534 DLL' field at a real + vendor PassThru DLL on Windows (e.g. PEAK, Tactrix OpenPort 2.0, + DrewTech Mongoose) + setting bitrate + IDs now actually opens the + device, connects CAN, installs a pass filter, and sends/receives + frames. macOS shows the J2534 option as unavailable. +- 32 tests still passing (no new unit tests in M2.7/M2.8 — both + benefit most from live hardware integration tests; unit coverage + for platform-gated backends lands later). + +## Next milestone — M3 (live data + YAML coding) - `src/MercedesDiag.Coding/Yaml/UserYamlProvider.cs` — user-supplied - YAML coding definitions. -- Periodic DID polling with graph/gauge. -- Coding tree UI. + YAML coding definitions (`ecuName → did → bit/byte → featureName`). +- Periodic DID polling task with a live graph/gauge view in the UI. +- Coding tree UI (read-only values first; writes land in M4 behind a + mandatory backup). + +## Then — M4 (coding writes) and beyond + +- `CodingWriteSafety` — every `0x2E WriteDataByIdentifier` preceded + by a `0x22` read that gets persisted to a JSON backup file in the + same session; one-click restore. +- Security access framework with pluggable seed/key from user-loaded + DLLs/scripts. +- M5: `.aed` provider. M6: C3/C4 MUX passthrough + partial CBF reader. ## Open items - Sandbox scope for `rohite1983/Bench-mercedes` still not granted, so the bundle workflow continues. -- Vehicle IP default `169.254.0.1` still unverified against the - user's actual ENET cable — if it doesn't come up, we'll switch - Connect to kick off with DoIP UDP discovery. -- UI language: English only; revisit multi-language in M3. -- No unit tests for AdapterProbeService / EcuDiscoveryService / the - real PcanAdapter yet — they benefit most from hardware integration - tests. Fake-driven unit tests can still be added for ProbeService - branches on demand. +- `TransportSummary`'s DoIP line falls back to the default IP/port + if Detect was never run — that's intentional; the Detect button + is the auto path and manual fields in Advanced are the fallback. +- No unit tests yet for `AdapterProbeService`, `EcuDiscoveryService`, + `PcanAdapter`, `J2534Adapter`, `DoipDiscovery`. All four gain the + most value from real-hardware integration tests; simulator-backed + unit tests can still be added on demand (e.g. fake `J2534Library`). +- UI language: English only; revisit multi-language in M3/M4. ## Known caveats still unresolved @@ -143,14 +150,14 @@ Expected after pull: - `ReadDtcs` unconditionally enters extended session; some ECUs reject. Will add default-session fallback once we hit one. - No security-access UI; API exists, UI lands M4. -- J2534 selection in the UI now flows to a stub that throws on open. - Real implementation in M2.7. - SDconnect remains unimplemented and will stay so until a real user need surfaces. +- J2534 backend is raw-CAN only (no KWP on K-line, no J1850). Fine + for every Mercedes use case we target (all are CAN or DoIP). ## Sandbox signing note Commits in the scratch repo at `/tmp/bench-mercedes` are unsigned because the sandbox signing server rejects writes from that path -(`missing source`). Every M0..M2.6 commit follows the same pattern. +(`missing source`). Every M0..M2.8 commit follows the same pattern. Signatures re-apply when the user pushes from his Mac. diff --git a/artifacts/bench-mercedes-m2.6fix-to-m2.8.bundle b/artifacts/bench-mercedes-m2.6fix-to-m2.8.bundle new file mode 100644 index 0000000000000000000000000000000000000000..cd80e6428e9450b9d9c5524e60cb740db345e131 GIT binary patch literal 7755 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 MjQUWHVa06!2MY)1sQ>@~ literal 0 HcmV?d00001 From ac946bbb680a9080acd31f96c2576509c526c22b Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 23 Apr 2026 12:43:31 +0000 Subject: [PATCH 19/38] M2.9: auto-discover installed J2534 PassThru devices via registry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User reported Tactrix OpenPort 2.0 was installed on the Windows PC but the app still asked them to find op20pt32.dll. The SAE J2534-04 spec standardises the install-time registry location at HKLM\SOFTWARE\PassThruSupport.04.04 — Tactrix, PEAK, DrewTech, Mongoose etc. all register there. - J2534DeviceEnumerator reads both 64-bit and 32-bit registry views and returns {Name, Vendor, DllPath} for each installed device. - AdapterProbeService.ProbeJ2534 now reports the device names in its details string instead of 'point the DLL field at …'. - MainWindowViewModel exposes J2534Devices + SelectedJ2534Device with auto-populate of J2534DllPath; Re-probe re-enumerates. - MainWindow.axaml shows a top-level Device dropdown when J2534 is selected; the Advanced 'DLL path' field is relabelled as override. Bundle bench-mercedes-m2.8-to-m2.9.bundle covers commit bac8ace. --- artifacts/SESSION_STATE.md | 46 ++++++++++++++++--- artifacts/bench-mercedes-m2.8-to-m2.9.bundle | Bin 0 -> 4462 bytes 2 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.8-to-m2.9.bundle diff --git a/artifacts/SESSION_STATE.md b/artifacts/SESSION_STATE.md index 3ae8765fe..bd0f643dc 100644 --- a/artifacts/SESSION_STATE.md +++ b/artifacts/SESSION_STATE.md @@ -1,6 +1,6 @@ # Session state — resume here next time -## Where we are — M2.8 shipped (real J2534 backend + auto DoIP discovery + UI hides transport details) +## Where we are — M2.9 shipped (J2534 device auto-discovery via registry) - **Scratch repo**: `/tmp/bench-mercedes` (rebuilt each sandbox session from the latest cumulative bundle — commits are unsigned there, see @@ -36,6 +36,7 @@ | 2210555 | M2.6f | Fix CS0246 missing `using MercedesDiag.Hal` for IDoipAdapter | | 932e9ba | M2.7 | Auto-detect DoIP vehicle + hide transport details behind Advanced expander | | 4bfe0f8 | M2.8 | Real J2534 P/Invoke backend (Windows-only) | +| bac8ace | M2.9 | Auto-discover installed J2534 PassThru devices via registry | ## What M2.7 added (UI simplification + DoIP auto-discovery) @@ -56,6 +57,37 @@ `[NotifyPropertyChangedFor]` on every transport field so the summary auto-refreshes when the user tweaks Advanced. +## What M2.9 added (J2534 device auto-discovery) + +- User reported that with Tactrix OpenPort 2.0 installed on the Windows + PC, the app still prompted for a DLL path — which is the wrong UX. + The J2534-04 spec standardises the registry location for PassThru + DLLs, so all compliant vendors (Tactrix, PEAK, DrewTech Mongoose, + Mongoose Plus, CarDAQ, etc.) can be enumerated without user input. +- **`src/MercedesDiag.Hal/J2534/J2534DeviceEnumerator.cs`** — reads + `HKLM\SOFTWARE\PassThruSupport.04.04` in both `RegistryView.Registry64` + and `RegistryView.Registry32` so a 64-bit host still sees the + typically 32-bit-registered vendor DLLs. Returns a list of + `J2534Device(Name, Vendor, DllPath)`. Deduplicated by DLL path. + Platform-gated: returns empty on non-Windows. +- **`MercedesDiag.Hal.csproj`** — adds `Microsoft.Win32.Registry` + 5.0.0 (the ref-only package that exposes RegistryKey on net10.0). +- **`AdapterProbeService.ProbeJ2534`** — now reports e.g. + `2 PassThru device(s) found: Tactrix OpenPort 2.0 J2534, PEAK + PCAN-USB Pro FD`, or a clear install-your-driver message when empty. +- **`MainWindowViewModel`** — `J2534Devices` ObservableCollection, + `SelectedJ2534Device` with a partial `OnSelectedJ2534DeviceChanged` + that auto-sets `J2534DllPath`. `TryBuildSettings` falls back to + the selected device's DLL path if the override field is empty. + Re-probe refreshes both the transport probes and the J2534 device + list, keeping the previous device selected if still present. +- **`MainWindow.axaml`** — when J2534 is the current transport, a + top-level 'Device' dropdown shows installed PassThru devices. + If the registry has no entries, a short hint explains the user + can install a vendor driver or set the DLL manually in Advanced. + The Advanced DLL path field is relabelled '(override)' and + preceded by a hint so users know it's optional. + ## What M2.8 added (J2534 PassThru backend) - **`src/MercedesDiag.Hal/J2534/J2534Native.cs`** — J2534 P/Invoke @@ -82,19 +114,19 @@ ## Next session — first actions -User on his Mac: +User on his Mac (or Windows PC): ``` cd ~/normalize.css && git pull origin claude/clarify-project-requirements-Qz5IO -cd /Users/mohammedouchrif/Bench-mercedes -git pull ~/normalize.css/artifacts/bench-mercedes-m2.6fix-to-m2.8.bundle main +cd /Users/mohammedouchrif/Bench-mercedes # (or the clone path on Windows) +git pull ~/normalize.css/artifacts/bench-mercedes-m2.8-to-m2.9.bundle main git push origin main dotnet restore && dotnet build && dotnet test dotnet run --project src/MercedesDiag.App ``` -(If the Mac is behind M2.6fix, pull the earlier bundles first in -order: `m2.3-to-m2.4`, `m2.4-to-m2.6`, `m2.6-to-m2.6fix`, then this -newest one.) +(If behind M2.8, pull the previous bundles first in order: +`m2.3-to-m2.4`, `m2.4-to-m2.6`, `m2.6-to-m2.6fix`, +`m2.6fix-to-m2.8`, then this newest one.) Expected after pull: - The top of the sidebar is much cleaner: Adapter → Re-probe → single diff --git a/artifacts/bench-mercedes-m2.8-to-m2.9.bundle b/artifacts/bench-mercedes-m2.8-to-m2.9.bundle new file mode 100644 index 0000000000000000000000000000000000000000..f469ab90732fe1a88313356a00ecadf4e9e52cb0 GIT binary patch literal 4462 zcmV-!5s~gAAa*h!XK8dGVs&n0Y-I{9G-76DFlIP8HaIagW@IulH8D41Vr4lnWiU50 zV=y&kHDqIAGB##mAWbqZI65G5WnpX}N-{MwG$2qfNp5y;Yh@r}VPk7$Ze$8#VPiO9 zV`VU9G&wjlFgZ3fIAmrsH#cT8IWlBqWH&cBFk&$_Wiv4#a%E<7FKA_9WOFZVVQFp( z3Q$2qO8@`>0ssI24w!%ec$}40TTdG~6n>vyao&ci$q;e{wyHJ)c1z18BD8(!i{m-N zc$wHE+rvex{qOtPP6DiWS%jj@iO=P`_>8yA#FMc+7>_4YF`P|?aymU69v)4PDqhW| zl^Bbuobt4qjj~o))}F?ziU$>r93D)nayXnE%;buX20WOJlhK$K!nxbpc2x3%lI*hVR!DEv6J58g7sh%T7K0uw&gS1}aWcQ^(W&Lf zTb4Cl8hvMs16N)agsNouPC3k(`I?n|DSmo!;i%Ik2Ke&r;_}z>`j6Y6^P96@+Y`&K zZPBY3jPXw`&Y?oKoS&sJ`v|(0(dD~i>xiH5-~j@sNVF|^LzU9;8S@0lYvC1mX`ZtH znMFyaqP4hJ`YxPWQ{6$e3QCxEIB5N7Sd>6uG=Z!8BFp;pMKt@defm6&44vt2%~p70 z3+ax5Sd@-d#@BI{>A1gAo`fzlqR}uuBvR}%Jt%&3wC4s!yc8{fF05JcCK$<07HvbA zw0Xo#!6ad({OZ5X-2*|Dfya*NlLjO1b54&n>)3ZEK`kO84TrPq5!4qX8y1#wZK$;B z%^k@JbsP{7^kw^~9EZ8*ZM**iT3+H7Hg5k?D4odL1z)C5rU9!41!Z8JK4O9;H_^ba z&LoutNV8snr)&Mrp_5wZI}YZmjkyOl;nM|gP1`|9bV{d_3kopq-psL&RK%{#o9N0I zkN{gn1|ntO&uL|amNhO+K{wowGDKVUd2m5{%B4t54i zpj8zqpSz9yan?ba*A%~Iw-8Ta-5e)XlQmRo;x{$(X@ErsOGIxOhC!cmQ#VmbM%hr&q2VgxlltfB@Zx}-&zro)N~CR4#P zq?vJ1;QvhU7@e07&;jG2l?Xeupxf8sJYD@At2tI7 zH^C#I$8sZ99MR=_;SFF_$sh7475J`%-0laF@L)T2amU_+p->~}W7^6o3iub3E#Gz;uCWgAAhx)0ac@oS)f#%hX*LJ^j-L=Dp6GF_R4#6#(XL4P5>Nkj-t+ zbS|+1|ER4zkGX-dXV8y!c$@)F0I~nO0=oi`7ZhT4I6JiM?XQc&nCEbt2E}{~k)@F< zMHG$lw3+7?_^&j#$q2~XP(OBCM|+WkM--^cn^dMb#=kV!igK-{B*C8pC=`+3T;eq* zM*agVI@9nu=pH588Kr8?C^JN20})JkoSV!vnQ6jy6Pt{AXCJe^*i)9fvdmR;OKd}( zjfRN<5GaIYrj{2o99N!wrROG#_?8b__6Mi9SKU3JtuXPm1^`2>8#?|0wt{gb6Tkc* zMV{l1JRGmz-ah!=c%18H>}8zbE3!v2)amYPsgOAL-o<*)u9kDBTsu24Q3n9JV+|Ge zPL`jz{(24OjUld54`nGeKAj1kPzc2#(dIIG>P$MZ>N# zlL&4q{*~P@EJ1Xg(L^#i-w*9`hv}>=7?qkK2U27y*EQ1;>*fM`L~LCoq~^w_p4$Uz zHwevw9e4tiIs3)Uqr%jrS2hPbZcbSvRff;Qv7wHtIlxTz9A?5N@M<`mqbHHVqt-Yh0yVRh9lfC6=hQD$_~!))9OFZJNt-gs2zN*)j|#zw0foa?Ym zEO~Iq_0*$zgDT^}<-ZRi*1CA~s#6y}Z(nu|5&SXoxfd zqxbuY4l$u-x_I2S+yb|_%j2rw``;BZx9@Y1rcG6jZ%*7gA06pnu0UymCh?4Vs?yc2 z9p*X8y0j^ZB}~nzD2rP*(X9ma|DTd)#fhc#SV`L8N5 zTtfA2c?Fe8*A>W=5&RhsVm>{Ndo!`d-)uAxppE$KK;$1LZHq&z1$dk@G%zqTF;VbM z%*+eV%uC5H*GsHO%*|m~;_JBfY^m|@{I5C{HYGgOOT6FzGsLb|FS(fEv|(pl?B;S! zlf9A3Tr#~YSMHj44geT)Bd7cu>(;^u00~IyxZma~X;d$@8PNW+^clQphqR%jmm4#0rHEt@0K}{Pvgsqi4)m0!p0;H9Sg5AbNHHo>4UAE?ffo_ z{3erlmq_7*X-)k$@hz3b`rHye+9}K}8;LTJe^x$h6K{=KjB-08J*o9N|7Y4;jP>gr zj);_vwg`cKYtZ6hKwa1mq#~UT-0)C9!~)6%P~k^RfZZTXCH!j#j!Is|ff^4kIG4-; z*LBxG4@#y$wHfSItI#8=4P6q1+U*AX06ZFzpvkD429%j37MDC6uE((N&J6m-=lmGG z&>bT%I!2Q~1OpN(zCoE{O{JBV;9V$JsD#Pb&A`bRXZ%seM#A0S)5O+>vU*oZs8TJF575V?pbS|Au z=6(g1L6EB#x&Y63oB=if$^VT4jRKIT6o-nax-ftqrXR~3YPdD01Rw}c4UxMa6iTm2 zJpSQELX|0VD_4t`^g%eAhmr0dNlX?)sR($SGc+(TGci%{GBPzbaZE`pC`m2SOD<+$ z6cyWkQOo~!ahyTge-ZC#T=y%I43U(&q?TnSr@H2q=B5@UmgIx=JZXG7E3;;SsLvHf zmfh;I=MKzSo{y}@FR>)EEES}Z?N`P5=YRI3zB@Owc;-a0dyn4LeFXrC8Z}tIk^y*} zwN*`zA~z7d^D8PShi-}Wj+n_FGTEK51G7t(8PGJEIc)Y|x@*9Sv0Jtqf)M{b<^F(f zK9W-`Bx>6~BB&0Oix*UhHv45?$_aOiu(fRgjS^C?&=`?mWi{1NJ_$nj_$fE^qu69a z`;g_98Oa^LVP{M_F9*$#qjv9}A`x2@fQgX50=V#%$oQy8dhiH19E z$^hTLhp0CwOx|7H_=76pCJ{E5U@j=A4M-gmo>uUt4G2X>(n~ZU^y$K6&>xK~tMH~g zCL({sI7Kzl#zB`|bzm~+eS^t;@2LZQgX<~A3wYFOuC+x#7c(Ht(jyvJpuqw$HDbjb zLafPeC1BaWs+K`7gm?>hmzsYa51pgaeiz23=+p z^o-#fHdv-^(+DXDZ};ZA*3qGTxMNkismyl;@$aP^nAC!6uM69D_@g0oDbK&CQgd^p z%8DD1bdWAZ;rbM#PJ>cqV)P7QrriQQ+`O9!2b6tq-OZ=_>{|(3Td*2 z6;jp_En+h*Yw0@MRM4yZ&Fr^~g}^)ZA<~|)JY;)N(h4~xYv8&0Q0SN^_x%TK;kk_Q zg}$?D@!_U(e&f0eyG!?9)GhC0@t0hZe$^pLaps@WXKs<^LG}HsSRotH!<3H{o={Yh zd~`K|o3JT2sQkrv{2VdLW*)HimW~el950Uv3yP{z*w}9}@Pi(y6Dq?d&aSa)3Yy<+HtLk=l*U;q@{Gi+kSkVrS;mX#M*Ol{d302=?tcOg+zNn4F%y6@* zgI-YZVh1Dm@c$6i7aP_~lE9andaw3Mv#AlwAncS{?UxixIS<22nR-%Wy{CpP`(kvK ze%=HLHE~E-+4?(B^!9tb^jT=wn7XOrayVC%`1kaRn>w%vCB`n8dz3kQ5XQRWglALj zOX;Di?^^!=RerRP`v*h%)@zki>Z$eaP^Gx-ztZ=*x;J>7+rhYyX~NnP1qB<=lGI%H zqWsbVJ1zwvun9;^&Q45E4N6T*ElSNxPF3*COU@}xNwrn-%}g%JFV0UZ(F@PaGd9u- zN=?r!E-9*1QV2^eD$dN$vsE(HGte_oQqTvPWuuQ|w2gj1QGQlxa)})m00bf@@c#ku zO#e6i=KMawJi@XZWQFu=I`y`AoBjpx2oL!L3O2a@9$4`RfU{2cW5OPRB zm!kDziCAo<)>_3D1j%LTPU}LtTXr{rQi9+Eh>)`n;gg7u;MsQ&Hz7UfFo*g0Gc&*W zfEWMuU>DUC8R{;lbJC{?85|xTwch<__aUPS7-oEm8X~Cb-74*gbb*Q*smLb8OQ8)- z5@bQxcAz#sgP@*3&SfeLL=iMYr}*01D}Hu*#kbpdDuv!i!Y$Q$@~F~!Cn%hAZBQWt zE}(xkypH4X&Bf%tbJvUGje49emr@zhY?Ti68L*P6f(!+dmO=3h71&6lf$ne!3o25p zT9t#hJ1nEZ{-F4D8tsx<&_zY8jpAZX29k@w+Xw3#mN6zcH35U@6c`y Date: Thu, 23 Apr 2026 13:07:16 +0000 Subject: [PATCH 20/38] M2.9 fix: drop Microsoft.Win32.Registry package (NU1510 on .NET 10) --- artifacts/SESSION_STATE.md | 1 + artifacts/bench-mercedes-m2.9-to-m2.9fix.bundle | Bin 0 -> 877 bytes 2 files changed, 1 insertion(+) create mode 100644 artifacts/bench-mercedes-m2.9-to-m2.9fix.bundle diff --git a/artifacts/SESSION_STATE.md b/artifacts/SESSION_STATE.md index bd0f643dc..a9d16f55c 100644 --- a/artifacts/SESSION_STATE.md +++ b/artifacts/SESSION_STATE.md @@ -37,6 +37,7 @@ | 932e9ba | M2.7 | Auto-detect DoIP vehicle + hide transport details behind Advanced expander | | 4bfe0f8 | M2.8 | Real J2534 P/Invoke backend (Windows-only) | | bac8ace | M2.9 | Auto-discover installed J2534 PassThru devices via registry | +| 4b99028 | M2.9f | Drop Microsoft.Win32.Registry pkg (NU1510 — framework now provides it) | ## What M2.7 added (UI simplification + DoIP auto-discovery) diff --git a/artifacts/bench-mercedes-m2.9-to-m2.9fix.bundle b/artifacts/bench-mercedes-m2.9-to-m2.9fix.bundle new file mode 100644 index 0000000000000000000000000000000000000000..1eafab667c81fe7ca54c6be825a9039400325ce3 GIT binary patch literal 877 zcmV-z1CsnBAa*h!XK8dGVs&n0Y-I{9Vqs%AVPj=5Wi&ZBG%z_fG&p2tGdDM8GdVJ3 zWMnrtI51){Hf1w0AWbqZIXWO=b#!knWNC9_Z+2yJAZc!MbYX04Wn>^qGBqBRgWoC0PXk}q!b1!XSX>JM%P(edW0000200005lPP$dm6AzuCRHN}*#Hgd4QfhhRc}^lU9L8!Evl+5>f9JpRhzWQ zN-8piQ|O$)O^=fyxN&iMuP>WVz0=r#gsiH{dR3Qs3UAUlly<|wA<+M2srx*sVbSu_ z@*0e|5$;)w^R5lafo+i|-|5Ic$TN(nPk5xa&T+akIZ#{(=GJMB38&; zJdR|)pr^Qo_$(2?R(;La#p;&MtZ8effdoVR0ocb2m?(3@$bCc|k*yCG$G_U;6ZHc2 zu-jnp0_98;MQSHf#%L&(pX+w|N^EX#b9kJ)z;uCWgAAic;G5r`-4YTPJ@aF@Zp6oI zD42a+Yq9~O0sz?g4CMX+0`$V3L*_m9X)Uf>m-4U!y+a9Hc$@(q0O9|;0=oi`a1@{c z)=U=qbayD*_{UpH&7U^;J-m^Gx75WC6#fB?^0b-f7Wl6;x5)^|+fYAtTSt3%oBSjRKI`6hr#fYn4>$srBwqrMT_C()YT$H<9ii|Em$@@&QV(Nj(1HMnaV-b1PSi zm-In6n}>LuTgbG7al%?|8~uQy{H)aE5<4ycJ@^JM!S|3TP884r9R!SsNKF?qqQwXI DSJITY literal 0 HcmV?d00001 From 940f03bc6a3e232c35d31fc56084201e7a844331 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 23 Apr 2026 13:12:43 +0000 Subject: [PATCH 21/38] M2.10: build Windows app as x86 for 32-bit J2534 vendor DLLs --- artifacts/bench-mercedes-m2.9fix-to-m2.10.bundle | Bin 0 -> 1985 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.9fix-to-m2.10.bundle diff --git a/artifacts/bench-mercedes-m2.9fix-to-m2.10.bundle b/artifacts/bench-mercedes-m2.9fix-to-m2.10.bundle new file mode 100644 index 0000000000000000000000000000000000000000..fae0dcd5009802c7024844ef803059bf924fd808 GIT binary patch literal 1985 zcmV;y2R`^CAa*h!XK8dGVs&n0Y-I{9G-5e9Ffuq{H#1=~GdN{5Gh;V2V`XA7HDWnq zV_{}7I5askF=k^lAWbqZIUp!zX?Q6*AY^iHa3D=-V{&hEZ)S8ZS7~lDGA>eOXK8bE za(N(dVPk7yXJsrPW^!R|Wp{6KYanoPZ+2;9Wpf~DbP70QVlrkhVL4(lWH2*1VKHGh zG&3_eHD)n3IXEJM%P(edW0000200008 zm_vA+l~c=Z+b|Hk>nrw_1dSEFV#(b9A>pa>x=y^r0EG7~ukd$oS`VsxYeo0rd z1LV>}br85DcXoDW=?oD}r(qc-K}OlMOlC0^MH!}XQHTuV4AYX*GELJGy%r5A2T4Ag z1reXb7{?hUu}Bj^d3c`BgupV)7$hu3;$i11ZQ!cLt{}M5{QDrr;B&17)}J6u)9Eak z&CU~e7x3o^-89lU`oApiHuA&Z0`gAQ1z_6(TG(b&&R-7`h@Vz-qlaZQ#cfEqvXhGJ3 zKy~Ec;p|5B`h@^r`73m?ry&*o{Q3>9LU&|6R}oxdansdX#u34d3llwSG%H0)m0HxxM zyzikwasPO>l&af$uy?|Op$4UTC48*(L5&>63kxy;@Q7G~_E5;OqPq?5PJ9NL_gHHs z5yB8`*S2iW-qu%7dp?uAXFBC%!zc`EPr>T3%cmR0kQO?HWy#%9;d6TScn#c=tISY*BVEOwh?>v<+oIUANh57Dz(B(hV{q$@RO^us`^EW; zGDbXi9oEoWplv&{8$cMfa25OTG+5LO7D;6tPuG|?E6WJ7#Pt>Z(Iu4UtF+oo7XCMoB=if$^W|o zy8@6G6t{Ad4>D{~eqmtn{t6_TXBKY&`H?F{6t$R!v<8?fOV>@k{yWW8C55IanKA{*^9r=2s=`BX)9s<8 zc3GX_P}A8A&6uP{u`PrQI?{9lKg)9$Q$;s1O_z8Sd?AFU?hX^8rsHQ9p`<(#${_GN zE~rWUR!!7PCjYGno>xA`==b)mR3fEXBPE;*gQ$JaOR=&c>UnF&$C{+!yv7lpVa9l| zMN;foo@r=9DsW<0Nzvru7%L&^$|kcH?OUu_$efrrq1L+P!}CU#H;9ywRGI2di9%u` zc*YD9eAsZVo8i3WU^s+xeD3R0>@-Gu7lY`Cx{QfhP&3-z_6O}+JZPU^C*P-kPzQ(5 z{sEu?)=U=qbayD*_{UpH&7U^;J-m3F>t*U?ny_5trJ(ZxK@K_oyRXilt&CB6?ZJ_G zbK>qG0J}R4BKrY{im19UfF7nF%N%OBHKzn12u}@ooa&*%KSW$w-$j>b*GKx2c&(5OXhX=5==#K^k!FH}PBOpns~8c9 zND7xKb;-0s1$91RQt*&+oogwlXv*EM22|k`Q9>bKUU0l(Qe}~*&r;S9<)FZ3*zBAe_AM_)@~y;>k{qfnp8JT%MA%>+L*Gn z%sf>>pJ{G~2$>4)wsJ_~Xp2D4XKFPAOgdYeXMSv0&>w2!og%iXwqrT_;&nT1vLlpU zdL2>j327}Wq Date: Thu, 23 Apr 2026 13:30:43 +0000 Subject: [PATCH 22/38] M2.11: J2534 battery voltage diagnostic on timeout errors --- artifacts/bench-mercedes-m2.10-to-m2.11.bundle | Bin 0 -> 2037 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.10-to-m2.11.bundle diff --git a/artifacts/bench-mercedes-m2.10-to-m2.11.bundle b/artifacts/bench-mercedes-m2.10-to-m2.11.bundle new file mode 100644 index 0000000000000000000000000000000000000000..f9a752c95d7f76224fb334de3244af0e23134f9d GIT binary patch literal 2037 zcmV=e;GBqlC zH)UZsH#i`2WoC0PXk}q!b1!XSX>JM%P(edW0000200006lu3A;l~c`f+At8l`ziKD zG6^1R^Jn@qC4@s-C>=^@ZyDKIV-2$8kz^>hK183ePtuhkX{SBa2RvSBcfUWJL4-IN z4#(*rX2U)oC*#2&=Dm0{N~2*i9`aGfM*TD`Fb!&EP&pXqSzPp3n$f)^Wf7ex)K)~p zblm4r*3Yv+#-k!&jVrZ*nPd$|m}&ZXowpzFq|TXq3(;saOb1afiQuM3Pmt@X63*fO zbp^{fjG_s=j|WK~3^EQG^HWZ6(9*FT0&}2iRB!{iMB-tHJt^%{025(iH9=+X}dQ58Z^oYdEw~6 zTOhQ=AcRecVA%0Og=@5`L&Uz-k_iRJ@-%^5H+=A5FBCPK2A!nH+ z3`e8YF35y4%+V*=N0?zgdjw&L12EvCD6kEJXIayNnh6sILHCSp%2`dige#JJYELSs zS7+{vr;e0u-1y_;?}*I>l1bZ0pOc)8~X08<>SBL!>=gx-yGKuZ@S>fPDo zrI1o=$!Hr=`|rUXGU3I8$gwL)LkYs~rb%SWQJcMm+Ftk(A{fnsTtv ziIQ*(+cp<|*zVgf9Lmi`gokX zz;uCWgAAj{%9Y;_1C*S;5l_LB`56#)0~4r%@Y|JdJd=wT)mo9x-a zb65y>*4)Jlc%0kKw3}%{fk=K>&~f)S_dXv`zakSH(kU-o5Kuj_Wjg@T^$oH90kxQh zv<8?fOV>@k{yWW8&&_#UBI`&9Y1w$3>tyU?oFFbD)19zt@2+)Q)EjokTkO3p zr4rSwHc>kc0J+r+M)6ny6&APADo@*UUNC0=6ib#0-*{qpoRw2gZxcrpKQsx#B}A1# zfr?rW3(#(H)_?NnV3R8qj+7v zI{U5u^U`s`Ut{EHaSgb z1!^YLt2XY{Mz9b6y!;(f9MFIvkT^ynBqUMHk5FJ29DEvMpkSj`GrmVu4S@C|swj_u zN3K^YOye7C{2vNskQ~$iPiPqN$N0_cJ{H_(7}|S3kxL9yWM0XgQr`f1P6- zYk}7tgm&f4LU3l2qUTU`?AVvrD62^ug(adVM49>C(K2^d_uJgQ= zpMLaXIf6s;&G?p1K`*UVtI*>DLM|2Tp$M>x5_X;}8EIvx)mO9EJCcV84ErP)T3skz zgSp~Dz=g1#HPj%soCy`+bVy(-_!O)otW|0&u3k95sNc_D(+hL+`a|*7(x{MenQU9O zm;bp_`q$zGIAGKl#7u%|U}VI@ix+V9U_j(HrZm88apnZ7L_~Ui{_?m|fgkFt%Pa8s z?&kKvervPS0m=i#8qkj7#BRxhpLTc4@Gw#NZ_Eu16reaH=CoXg&~mVoC%u!>*<~{$ z&`NqHWX}xxfG}^9F&^yPXWS>uk@Okzi#^9Caota=s>INe)NkjCPuiA=Gu4lSZYHK} zTbhMu5;AAc)@I)hQ`rbmkCgC!LBY$%WZb5%T<++F;@oUj9{u|3E8pkk0LNy^^Gyib zWNoX_$;0(G=P%9%L Date: Thu, 23 Apr 2026 18:45:55 +0000 Subject: [PATCH 23/38] M2.12: per-ECU CAN ID mapping routes Target ECU dropdown on CAN --- artifacts/bench-mercedes-m2.11-to-m2.12.bundle | Bin 0 -> 2928 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.11-to-m2.12.bundle diff --git a/artifacts/bench-mercedes-m2.11-to-m2.12.bundle b/artifacts/bench-mercedes-m2.11-to-m2.12.bundle new file mode 100644 index 0000000000000000000000000000000000000000..307ba4ce721da8ea72d2166a17f3ddbb79c868d5 GIT binary patch literal 2928 zcmV-$3y<_8Aa*h!XK8dGVs&n0Y-I{9HDX~jH#TKqWHvEoGGQ=bI5RO}He_ODH!(9c zGdE;7I5#(CVK_H9AWbqZF)=zIN-{MwG$3+iVPqg;VRUq5a(N(jZ)|j7XJsH^bRchV zWo{rVAY*K0VRB`1AarSMWp8zKAZ2oLZ*mG^GiGLEHZ^28IA%3CH#KH4GGt+8W;ZxC zF=S4wnGGsL%a%E<7FKA_9WOFZVVQFp(3Q$2qO8@`>0ssI23Y>I!oRw8e za@$4_-QyI!qf{nAf*=V>PEt`I+G46GsZ3eUb~qRiQvqj?nSm+pa){g^N66ks$w~5N z0MYg`TCgy`?tZUdKRF`=CCembvw4y+RuGELZ`*oiDj=V?|fmsuv*GFwKhb(J=h*Q_lB2sS#$h%0E(mb5HAAIOndM|=5=cUb%5KhH41qq z(N1vITG3ZE{&hM}XFfDpQFpa?3`b^BojnLAd59`L3v;4BTKq;w9~%|>SEYQxlbori zmvwO`UVa>8tI2>a{MjnsT*kERE~0V*qLu-8#Mwb~Rr@2M_EL$E*N8ncMGb~Xm*Mct zCa<*QB95XFZG_>X5O&4eYhp!#%Z-y-fxf;HdgH%7;Oi~jF^lg_->b4_`?nF%liq?} zY$$ysoC$?61N!n$Xf8mEv(<7y$4aQsXP~tDyNVFRR{CghNAk*-ZwUgXLK+Z>_M$Qa zBy3lMZtzDBzueN@c7z1+_b77aSgrThptG(mNfi>|`e?nTraD>4JvJ29$3)>s-!N$` zU97hcl+3fmd^Dpkf6wFe63>}C(+yT_qah>o+{F)Uk%lu(;bALOe zIF2vLN=G|UNfmTV91=3&`JOp(WG7!64x}O9>m3woLlvAUrTtT{cwYHYsW4aj%Cm## zo|7}-UZ@CiA|-I~R<9rFVme9YZy+89((EO{E|{Y2Z9jTGLORZ8wE6g33@SPSkZ*@VUfp-p;t~w?an^XkRDJ^MnPB!a45Y(4s8C z?CU6e>$KMayQg`x8bkeKuXyhcE_k~Q25jWM3N}BakP8mb*506fB_wgn1N5#O(_f~ef7JWy(P%7?FOL2LZq;Xd@B$-diBhIbgN0Ji zCwUe)ZF{FlpXqp0y8^ockQWqV+=gJm(x5L_AN+FD8y)75`?D-(0~F8u|VMw{nvYGHg+PVPNq73M86m z7Hi=5xD>r5znAD_e@PA*kY6$q^U_mOG=NOclGNO=%+zw< z{FKxj`^gHvVv`TJvrL{K$u)VgrzuNjnu5mUQ`|0L$TopMSz=CUD%cvJ9U&E-DIjN6 zE7U5KRNz$_gru~nV)8;s2?eMD9;p=yz(A|e3&{^IDFQlKLn*>oNzrORsBtT3a$} zYu8Q_MNum80wD7QJOL61#FcALyh4v05nK^#CvG7e*o!qgGr#Yf^_<`QwejZrT*`nr z0k>S{w?HBE#aJ_;2{dq=e{%a*xqN0CXT3moYy))Hb)ZYQDC!ZTBo27PFTxm5Fd7B0@-XQgm2wGnC$5qWT63ns$8KN z`sskt@N=qsXS&pwO&6wT*+tzfRM*OLS&lU{mBXop41tTWi1_*z!r+No&@}L@3AYX6 z05MI5oJR&dVl&v%h655f2+kVRudcUXwt<>Ks} zSTY3F)t*HQ2aG^>Ck0BK&i?~4Th@WQi_HTy@Mk-78#FWA#P3P4WHk*6~10O z2Ps*=29(A-osyI+-y(h#_S3jpR9-219M04C!>{Sh2mdJyf23Qhu*ynJ`(t(e_O;&w aB@S8}O=>#oMFpmjqM>*aTs(X&AMT>gqh}!i literal 0 HcmV?d00001 From 77da000a025ef8335fcce93579cdbe542a721c01 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 23 Apr 2026 19:11:52 +0000 Subject: [PATCH 24/38] =?UTF-8?q?M2.13:=20connect-once=20on=20CAN=20?= =?UTF-8?q?=E2=80=94=20bus=20scan=20+=20read=20all=20ECU=20DTCs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- artifacts/bench-mercedes-m2.12-to-m2.13.bundle | Bin 0 -> 6452 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.12-to-m2.13.bundle diff --git a/artifacts/bench-mercedes-m2.12-to-m2.13.bundle b/artifacts/bench-mercedes-m2.12-to-m2.13.bundle new file mode 100644 index 0000000000000000000000000000000000000000..4fde090fb7e38cd31385c7a1f390fd01531aa399 GIT binary patch literal 6452 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 OYYQWzMhZz5b}6Zbnn<|- literal 0 HcmV?d00001 From ab905e48a7cbb393598a3b731efe79d9f0da9fc4 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 23 Apr 2026 19:16:59 +0000 Subject: [PATCH 25/38] M2.13 fix: build errors (CanFrame named arg, UdsNrc comparison) --- .../bench-mercedes-m2.13-to-m2.13fix.bundle | Bin 0 -> 1257 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.13-to-m2.13fix.bundle diff --git a/artifacts/bench-mercedes-m2.13-to-m2.13fix.bundle b/artifacts/bench-mercedes-m2.13-to-m2.13fix.bundle new file mode 100644 index 0000000000000000000000000000000000000000..76d2cc12dde970d58640982fb935057c7eeaa815 GIT binary patch literal 1257 zcmVdK0W;if0Wier6HaTK2V=-l8 zIW#pnI5jviIX5sjAWbqZF*7JM%P(edW0000200006mnwLi zm6E}Z(=ZT*?|F*3r4`-ECQY2I5JH4S+5;=p6%R16C#@l|E8Btg#zXLgJPG4PrDrVJ zk}c2wfB)Di5P=d^J658tn|5d#U29Xxnns27P8-y+!$H@L#Nvd3T!OX|qpF3{YA455 zNRp_VZV+0M?sj$8)~)Q6Pz5gO=mYco~akpr+pu@o(E)&Xx(8V_Lxrm){pV| zZ}FbSC6akh&K_J2FNEaqe*lLY+~M#7D}L~iq!?+Ats01+FZ9Hj77Sp(c$~Yybb)Du z45P@~>rEbQtv=!lB^*B-k`p&rcR+0FWCKP80NPdzkp2NLxABg_u)Gkjo$1@S!eSoXNpc$@(?0LlO61LgyeN)%FI)1mVEHDnSTwg_oKMC$5oRd=ye- zWGq40*29Z=A-+gBiyElXGH8+R_>#gH_9%n0|XoY#$R!7lT!pOoNC|O zdGF24`}XtB>v5$4lOYn+F6<>*t2Fg-;4I2>By~%*S~_E_EELXP9Vn2dQH( zLFgn`pls=+J!K}!B8ZX7vEkLT&}Q(#p=D4Mpu~Z2ixGdND6)(~R!>T&!)dz>nI;*c zZBKKejlql?{_Cg%)};pnM_Cw*w0Cmju{Mmd$Pk{-vGiJp1ZCGFldBAY7Qd^?_GXZe zjmiakk_D>_Qmseu$H9xk0-3B1@mbIoK`n{|EXkqTe?fP literal 0 HcmV?d00001 From 15bec9ac63c0879f668051fe134a5d3898b93061 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 24 Apr 2026 00:52:57 +0000 Subject: [PATCH 26/38] M2.14: 0x78 pending loop + KWP path in aggregated CAN + wider scan + clear-all --- .../bench-mercedes-m2.13fix-to-m2.14.bundle | Bin 0 -> 5301 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.13fix-to-m2.14.bundle diff --git a/artifacts/bench-mercedes-m2.13fix-to-m2.14.bundle b/artifacts/bench-mercedes-m2.13fix-to-m2.14.bundle new file mode 100644 index 0000000000000000000000000000000000000000..2c8ad607565ca48abcbd7a4f5aeb378f698fcf44 GIT binary patch literal 5301 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 HvE!3LquUht literal 0 HcmV?d00001 From 92d93d6de3f9e789c9d46bbd033028e06d1d2ecd Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 24 Apr 2026 00:59:17 +0000 Subject: [PATCH 27/38] M3.0: OBD-II Mode 01 live data tab (RPM, speed, coolant, etc.) --- artifacts/bench-mercedes-m2.14-to-m3.0.bundle | Bin 0 -> 5526 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m2.14-to-m3.0.bundle diff --git a/artifacts/bench-mercedes-m2.14-to-m3.0.bundle b/artifacts/bench-mercedes-m2.14-to-m3.0.bundle new file mode 100644 index 0000000000000000000000000000000000000000..a019c259abd0c5d4e50ab98949be35b7221aed82 GIT binary patch literal 5526 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 YB;?TezI{*Lx literal 0 HcmV?d00001 From 2d2971370bab9bbf133fdd6af47dcc2c73db28a4 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 24 Apr 2026 01:08:52 +0000 Subject: [PATCH 28/38] M3.1: YAML coding provider + read-only Coding tab --- artifacts/bench-mercedes-m3.0-to-m3.1.bundle | Bin 0 -> 10247 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m3.0-to-m3.1.bundle diff --git a/artifacts/bench-mercedes-m3.0-to-m3.1.bundle b/artifacts/bench-mercedes-m3.0-to-m3.1.bundle new file mode 100644 index 0000000000000000000000000000000000000000..d15ef1d922bcda9968cd673a8910e2971da3b591 GIT binary patch literal 10247 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 Date: Fri, 24 Apr 2026 12:40:16 +0000 Subject: [PATCH 29/38] M4.0: coding writes with mandatory backup + restore (UDS 0x2E) --- artifacts/bench-mercedes-m3.1-to-m4.0.bundle | Bin 0 -> 11086 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m3.1-to-m4.0.bundle diff --git a/artifacts/bench-mercedes-m3.1-to-m4.0.bundle b/artifacts/bench-mercedes-m3.1-to-m4.0.bundle new file mode 100644 index 0000000000000000000000000000000000000000..3ede9efd431bc6a0d7ebe891435ffee027417cc8 GIT binary patch literal 11086 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 Por7H@*5ctQ Date: Fri, 24 Apr 2026 18:29:51 +0000 Subject: [PATCH 30/38] M4.0 fix: RelayCommand property name (no Async suffix) --- artifacts/bench-mercedes-m4.0-to-m4.0fix.bundle | Bin 0 -> 891 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m4.0-to-m4.0fix.bundle diff --git a/artifacts/bench-mercedes-m4.0-to-m4.0fix.bundle b/artifacts/bench-mercedes-m4.0-to-m4.0fix.bundle new file mode 100644 index 0000000000000000000000000000000000000000..f4072f68f7c9e422a33b1e08292cb61c359e216b GIT binary patch literal 891 zcmV->1BCn|Aa*h!XK8dGVs&n0Y-I{9WHm7`Ic7F9F=1jdWjHu9HZU|ZVP$4AIb~ut zIW=Q2IWsV3G+{M1AWbwbFghS(Z)9n1XCQZSX>?_CAa`kWXdrE2Ze(F}Z*qAcVqs%z zb#NdnAaZ4MbZ>HHAShKtQy?&SGDRs0GBsj3I5K5rIb}0BHfA_tGc+?ZI5%Q9WMwuo zGch$bWH~o6W;tSHAaZ49b1!IRVPtbJZDDC{3JOp`LrVYv00IC200xyIc$}4xO-{ow z5QX!fX|58i^hzp3ouxV}kwlB0EQ5-dGS^AC#BxPh7A7(Zk@PC3 zGRfmg=AqOP#)-h5x6VURW3LDbHKS-TFk5$nt!B{mdIW_iMp17K5BJX1 z&xV7W-L8ShTdHv=js{QAu{Uk^2M^l2MjZMLjc+Kh*bwZuWMM;=JhHKyiMyV-pSI9? z*OKSq6gnrS=nvj7O~UyC-e2F~yZZ&rtz-Bl{+ulWvEE_rtif4#_%A$18|@ zhbefR+s(9_X@a;&{L}Jx2m21HtLb~}yij4-yyNM+mW|p1i~!_U4rKlTXy-UQ*tN?S z4STU_P>D?u>1m4uc$@(q0O9|W0+Rxe*A(0Ht(%V~g~^@kp;K~x*@`EM#c+}9DDqtp z7^?+%oHH~qFf%bx@J-Cj3(w3;$uHMStVqnwVK`v^!o#EaN@q%|)C&{K^p9t5Je4!V zu2wI(n4!xD*^8#cEYGU|}MDgM?I`YQDWoOQk z>S%bJ`?!zs`98)C#o?3hTPsXX@RiuSAv}S3@|I}R$ Date: Fri, 24 Apr 2026 19:45:31 +0000 Subject: [PATCH 31/38] M4.1: DTC format + status-mask filter + VIN fallback --- artifacts/bench-mercedes-m4.0fix-to-m4.1.bundle | Bin 0 -> 3379 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m4.0fix-to-m4.1.bundle diff --git a/artifacts/bench-mercedes-m4.0fix-to-m4.1.bundle b/artifacts/bench-mercedes-m4.0fix-to-m4.1.bundle new file mode 100644 index 0000000000000000000000000000000000000000..c20db8e7049c324fe405a0e97c2688b97ddc1727 GIT binary patch literal 3379 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 J@ksK(GHBf*Or8J$ literal 0 HcmV?d00001 From 4c8cd20a9813e78f0af40a667f3389587feca7ce Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 24 Apr 2026 20:01:51 +0000 Subject: [PATCH 32/38] M4.2: UDS timeout 5s + live-data stop hardening --- artifacts/bench-mercedes-m4.1-to-m4.2.bundle | Bin 0 -> 2966 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m4.1-to-m4.2.bundle diff --git a/artifacts/bench-mercedes-m4.1-to-m4.2.bundle b/artifacts/bench-mercedes-m4.1-to-m4.2.bundle new file mode 100644 index 0000000000000000000000000000000000000000..6ed59ba7368d9aa69cf2360f8bfdcc6fb733de7a GIT binary patch literal 2966 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 Date: Fri, 24 Apr 2026 20:18:36 +0000 Subject: [PATCH 33/38] M4.3: extend CAN scan to Mercedes diag range 0x600/0x6XX --- artifacts/bench-mercedes-m4.2-to-m4.3.bundle | Bin 0 -> 4322 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m4.2-to-m4.3.bundle diff --git a/artifacts/bench-mercedes-m4.2-to-m4.3.bundle b/artifacts/bench-mercedes-m4.2-to-m4.3.bundle new file mode 100644 index 0000000000000000000000000000000000000000..3fbb8ccab1b344ce393d766ae4595823901e1803 GIT binary patch literal 4322 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 Date: Fri, 24 Apr 2026 20:39:27 +0000 Subject: [PATCH 34/38] M4.4: expanded ECU label table for Mercedes diag-CAN --- artifacts/bench-mercedes-m4.3-to-m4.4.bundle | Bin 0 -> 2393 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m4.3-to-m4.4.bundle diff --git a/artifacts/bench-mercedes-m4.3-to-m4.4.bundle b/artifacts/bench-mercedes-m4.3-to-m4.4.bundle new file mode 100644 index 0000000000000000000000000000000000000000..b46c3cec09835f1774cc201d69e2a9ae88d85c55 GIT binary patch literal 2393 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 Date: Fri, 24 Apr 2026 20:41:21 +0000 Subject: [PATCH 35/38] M4.5: ~140 Mercedes diag-CAN ECU labels (full-chassis coverage) --- artifacts/bench-mercedes-m4.4-to-m4.5.bundle | Bin 0 -> 3556 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m4.4-to-m4.5.bundle diff --git a/artifacts/bench-mercedes-m4.4-to-m4.5.bundle b/artifacts/bench-mercedes-m4.4-to-m4.5.bundle new file mode 100644 index 0000000000000000000000000000000000000000..3f57b1a747a6bb11aa1372964547175b7281bbe5 GIT binary patch literal 3556 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 Date: Fri, 24 Apr 2026 23:44:24 +0000 Subject: [PATCH 36/38] M4.6: VIN decoder showing chassis/year/plant under the VIN --- artifacts/bench-mercedes-m4.5-to-m4.6.bundle | Bin 0 -> 4446 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m4.5-to-m4.6.bundle diff --git a/artifacts/bench-mercedes-m4.5-to-m4.6.bundle b/artifacts/bench-mercedes-m4.5-to-m4.6.bundle new file mode 100644 index 0000000000000000000000000000000000000000..409fb68bf6fa2b197421c1cb902b2b430b0664cc GIT binary patch literal 4446 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 Date: Fri, 24 Apr 2026 23:50:48 +0000 Subject: [PATCH 37/38] M5-prep: CBF/SMR-D inspector tool --- artifacts/bench-mercedes-m4.6-to-m5prep.bundle | Bin 0 -> 5023 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m4.6-to-m5prep.bundle diff --git a/artifacts/bench-mercedes-m4.6-to-m5prep.bundle b/artifacts/bench-mercedes-m4.6-to-m5prep.bundle new file mode 100644 index 0000000000000000000000000000000000000000..e051650ff769fa51db0453d8e9f7797fab55b797 GIT binary patch literal 5023 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 literal 0 HcmV?d00001 From 08b44dc5c777e9c7b8fbdc07fea3fde44f89185b Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 24 Apr 2026 23:57:37 +0000 Subject: [PATCH 38/38] M5-prep fix: implement ReceiveAsync in test fakes --- .../bench-mercedes-m5prep-to-m5prepfix.bundle | Bin 0 -> 1449 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/bench-mercedes-m5prep-to-m5prepfix.bundle diff --git a/artifacts/bench-mercedes-m5prep-to-m5prepfix.bundle b/artifacts/bench-mercedes-m5prep-to-m5prepfix.bundle new file mode 100644 index 0000000000000000000000000000000000000000..ac1a01c30cc2e65fb073a48b2cf0eaecc9d392cf GIT binary patch literal 1449 zcmV;a1y=eaAa*h!XK8dGVs&n0Y-I{9W@a@rFflecH8M0}VK6r}GdVY9VPs`9WH2^2 zIX7lCGcz+{HezIDAWbzbaB^jEIv`_WW-V!Mb8uy2bRc7IZgX#JWgv8KZ)_lRZy;uA zZf9k3aB^vGbRa`QMlVxMQY}OvW@&6?a|&ZOWnwijF<~|{VPr5cHfCiqI5=Z4I5#zB zVlXv1F=1jhIWS{kWnv(5WoC0PXk}q!b1!XSX>JM%P(edW0000200007k}`Oll~K)Z z)G!df`zhwuR?sEcY~p4?2((a%LlG)PoE>|zNl9$uaY%dXL-2$=3FGV{wSo&iSWafX zznK^ip=xkb6)uXVY}O;tYUS zaJQ(F$$mJXIl1SzaCYgM2*U}%*WMa86I*f?w?Y71rdTi1{dXQsu!T{vWD1`+3@9BO z(V|KW|6=GP?p5Rn*GS%3!kbh|SUy|!JMg^t~J9z8DnfXM%%MW{KY}ROge2=AIc|iYH?? zfiqHS9MgPVFc?;kE%W4_0B$FWB6cB-^4G&pMmjodg21@6V-vV}k@iPRUd3)Degnld z5i0Nkdg)~sWu|}r#;Ty{kZMUF!SSLRc%1vd^nq!E4Wmf<<3+D?y`9f|*3ML}$tZ~I z|7w#pIe<|C0P^<^384dcoHH>10tMgHqU6++)MA&+#B{yTlw!S*)Z&t2hN@;)q2z~) zULR(^X&0AQ%<<&ur zked|mNp(uGFdk&<>m#j0ZS@}u$H?rFuc{Q_r`7+=IN=J#^tYfd^s*grr}#LqrW^VB z0b-yAH?H3Q#*!QJxe;I%N>i&T`h^UYIvM&kk3lPKoG`B!Al>YAb1!GLIRq4DT@6A zLff<2coLOuGBpe7?z-8e30i#xYkU#$;8TcKZ@!9~KWz^>r-7OIecyaPTi^BPuP*2k zlEy?KNF*L-K?-LPM%bOC3NNqva3hd;l--Va5b${KYq%od^ zDRaS-gtA-)XFwTn>7lgiPT@bA1k{C?QxAshE;qmOYL-u|$QJbe`Nyt~%xdfX!Dt)V ztFgVa(Kj7B!?Dorm2P;X_FihceL4m6FV2za0864?gqTR3SE4Md_%pBjqRU3L<90FW ztS5_gr+mrhdC=gLio?W3p(tl&b9vp^_jQ7dL#4h66BGvz18rQ|&5FFp9*su!Ry{Q2>nTmXz#0Gmy<#R}wc6jDABq{!?Vrdx7XMvdUJ_X1 DJkO#v literal 0 HcmV?d00001