docs(v0.14.2): slice 3 — n62-real-car.md harness doc + ROADMAP cycle closeout - #178
Conversation
…closeout Slice 3 of the v0.14.2 'Live Data on the Bench' cycle. Two doc-only changes: - New docs/validation/n62-real-car.md — chassis-specific bench-verification harness for the N62 / E70 X5 4.8L profile. Mirrors the shape of can-broadcast.md, dtc-history.md, injector-validation.md, etc. Five sections covering wire-up, cold readings, running readings, GitHub report template, and what we'll do with the report. Critical row is oil temp (0x5C) — if it returns -40 °C the slice 1 enrichment needs reverting for that PID only. - ROADMAP.md — v0.14.2 cycle header In Progress -> Shipped 2026-07-29; all four cycle-table rows marked ✅ Done (PR #171 / #175 / #177 / #178); last-updated line rewritten with the cycle closure summary and the explicit v0.14.3+ carry-over for the deferred PIDs (0x5E, 0x5F, 0x62) and the per-PID dim + remove-from-profile UI. Tier A, no transport/protocol/commands.rs touches. No test impact. EOL parity: new doc matches the existing 6 docs/validation/ files (CRLF); ROADMAP unchanged EOL. Co-authored-by: ohgeeceee <ohgeeceee@users.noreply.github.com>
|
🤖 Doc-only change — auto-merge enabled. Will merge once required checks pass. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b423f74150
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| | `docs/validation/n62-real-car.md` harness doc | 🔲 Open | A | Chassis-specific verification path. Cross-links v0.14.0 `docs/validation/can-broadcast.md` for users who eventually get an OBDLink SX on the same chassis. | | ||
| | Cycle plan + ROADMAP v0.14.2 header | ✅ Done (PR #171) | A | `docs/v0.14.2_plan.md` + this ROADMAP entry. Docs-only. | | ||
| | `community/profiles/n62.toml` enrichment — `0x5C` (oil temp) only; `0x5E` / `0x5F` / `0x62` deferred to v0.14.3+ (each needs a new decoder first) | ✅ Done (PR #175) | A | Replaces the unverified `local:10` placeholder with the standard OBD-II PID. Removes the `[UNVERIFIED placeholder]` tag and the "oil temp unverified" mark from the profile label. Adds an N62 instrumentation-context header block (valley-pan slow-coolant monitoring, oil-temp cruise band, Valvetronic load/throttle inverse, idle-voltage target). Bench verification on the E70 is the gating step (slice 3 harness doc). | | ||
| | Live Data panel UX polish — polling-rate selector, per-gauge peak tracking, range bar, snapshot-CSV button, NRC error surface | ✅ Done (PR #177) | A | `src/index.html` + `src/css/app.css` + `src/js/main.js` + `src/js/live_data_panel.js` (new pure-helper module + 15 tests). 221/221 JS tests green. The per-PID dim + "remove from profile" UI is deferred to v0.14.3 behind a protocol-layer change to surface the DID in the error string. | |
There was a problem hiding this comment.
Keep the cycle open until the UX slice is present
This marks PR #177 and all of its UX features as shipped, but the reviewed tree contains neither src/js/live_data_panel.js nor its tests, and src/js/main.js still uses the old hardcoded 250 ms poller without the selector, peak tracking, range bar, CSV snapshot, or NRC surface. Closing v0.14.2 here therefore advertises functionality that this commit cannot provide and leaves the new harness referring to a nonexistent error surface.
Useful? React with 👍 / 👎.
| 3. Click the **Live Data** tab. You should see the 10 gauges | ||
| (engine speed, coolant, oil, IAT, load, throttle, MAP, speed, | ||
| voltage, ambient) populated within ~1 second. |
There was a problem hiding this comment.
Tell testers to enable continuous polling
When a tester follows these steps, merely opening the Live Data tab never invokes read_live_data: the current UI starts pollOnce() only when the unchecked-by-default Poll continuously checkbox is enabled. Consequently the promised ten populated gauges remain blank and the bench-verification procedure cannot proceed unless this missing action is added.
Useful? React with 👍 / 👎.
| - A real BMW E70 X5 4.8i (N62/BTU, MSV80-family DME, D-CAN @ | ||
| 500 kbps). E60 545i and E65 750i are mechanically the same DME | ||
| family — they all use the same Bosch ME9.2 firmware; the harness | ||
| is identical for any of them, just change "E70" to "E60" / "E65" |
There was a problem hiding this comment.
Use the N62's ME9.2 DME designation
The target is labeled an “MSV80-family DME” here even though the N62 profile identifies it as Bosch ME9.2 and the next sentence says these cars use ME9.2 firmware. This contradiction also propagates into the report template's request for an “MSV80 version,” so real-car testers are instructed to identify firmware for the wrong ECU family.
Useful? React with 👍 / 👎.
| Start the engine. Wait 10 minutes for the oil and coolant to reach | ||
| operating temperature (or just idle until the coolant stabilises). | ||
| Read each gauge and record: |
There was a problem hiding this comment.
Separate idle warm-up from the cruise oil-temperature check
This tells testers that ten minutes or idling until coolant stabilizes is sufficient before evaluating the following table, but that table and the pass criterion require the 95–110 °C oil temperature explicitly described as a sustained-cruise value. A valid cold-start idle run can therefore be reported as a failed 0x5C decoder and trigger the documented profile rollback; require an actual sustained drive for the oil-temperature criterion or use an idle-specific expectation.
Useful? React with 👍 / 👎.
| The **critical row is oil temp**. If `0x5C` returns a value within | ||
| ±2 °C of the IAT reading, the encoder is `temp_u8` and the swap | ||
| from the `local:10` placeholder is **confirmed**. If it returns | ||
| `-40 °C` (the SAE J1979 sentinel for "unsupported"), the PID is | ||
| absent on this DME firmware and the slice 1 enrichment needs a | ||
| fallback to `local:10` or a different OBD-II PID. See Step 4. |
There was a problem hiding this comment.
Do not treat decoded -40 °C as an unsupported PID
A displayed -40 °C means the ECU returned a successful 41 5C 00 response and temp_u8 decoded the valid raw lower endpoint; it is not how this implementation identifies an unsupported Mode 01 PID. Unsupported PIDs are determined by the support bitmasks or by a failed/negative response, so this rule can falsely classify a valid cold reading as absence and initiate an unnecessary rollback.
Useful? React with 👍 / 👎.
| A failing report (oil temp returns -40 °C, or any PID returns an | ||
| NRC) **reverts the slice 1 enrichment for that PID only** — the | ||
| `local:10` placeholder is restored as a `[UNVERIFIED placeholder]` | ||
| with a comment pointing at the failing report, and the harness is |
There was a problem hiding this comment.
Restrict the local:10 fallback to the oil PID
This rollback is triggered when “any PID” returns an NRC, but restoring local:10 is meaningful only for the oil-temperature 0x5C entry it replaced. If an existing PID such as ambient temperature or module voltage fails, following this instruction would replace that unrelated parameter with an oil-temperature local identifier; those failures instead need their own support/query investigation.
Useful? React with 👍 / 👎.
| A passing report (all 10 gauges within expected ranges, `0x5C` oil | ||
| temp matches IAT at key-on and reaches 95–110 °C at idle cruise) | ||
| **removes the `[needs verification]` label from the `0x5C` profile | ||
| entry** in the next v0.14.x release cut and is the gating evidence |
There was a problem hiding this comment.
Preserve the verification marker until the report passes
The harness says a passing report will remove a [needs verification] label, but the reviewed community/profiles/n62.toml already labels the entry simply “Oil temp” and its header asserts that 0x5C is consistently reported. There is therefore no marker left to distinguish the still-gated PID before evidence arrives, and this documented completion step cannot actually be performed.
Useful? React with 👍 / 👎.
| 1. Connect the K+DCAN cable to the E70 OBD-II port (pin 6+14 for | ||
| D-CAN). If the DME does not respond after 30 seconds, try the | ||
| K-line fallback on pin 7. | ||
| 2. Open the BeeEmUu app, click **Connect**, select **`n62`** from | ||
| the profile dropdown. |
There was a problem hiding this comment.
Select the K+DCAN transport before connecting
The connection selector defaults to Simulator (virtual E90), but these steps never tell the tester to change it to K+DCAN or select the cable's serial port before clicking Connect. Following the harness literally therefore connects to the simulator; it returns synthetic values for most of this profile while omitting 0x5C, which can produce a convincing but entirely false real-car failure report.
Useful? React with 👍 / 👎.
…der claim (#182) Two small doc-rot fixes from the same audit that found the v0.15.1/v0.16.0/v0.16.3/v0.16.5 false claims in the forward roadmap (PR #181): 1. community/testplans/README.md:33 — 'UI rendering lands in a follow-up' was wrong. The walkthrough verification badge is shipped in the desktop app (src/js/main.js renderPlanVerifiedBadge, PR #127) and in the standalone walkthrough HTML bundle (src/js/walkthrough_bundle.js buildBundleHtml, PR #127/#130). The README now points at both rendering sites. 2. community/freeze/README.md:68 — the reference to 'docs/validation/freeze-frame.md harness (planned v0.14.1)' was stale: the doc didn't exist. v0.14.1 shipped without it. This PR ships the missing harness doc + updates the README reference. The new docs/validation/freeze-frame.md mirrors the n62-real-car.md (PR #178) and can-broadcast.md (PR #164) shape: 5 steps, copy-pasteable GitHub issue template, a 'Verification results' closeout, and explicit cross-references. The per-ECU schema format (offset, width, scale, bias) is already documented in community/freeze/README.md and referenced verbatim. The DME/DSC/FRM freeze-frame byte-0..2 convention (engine speed u16 BE + coolant byte - 40) is the only portion that's shared across all three simulator fixtures and chassis-validated today; offsets 3-8 remain unverified and the harness doc is explicit about the 'do-not-invent-meaning' discipline. Tier A, no test impact, no code changes. Auto-merge on CI green per CLAUDE.md rule 2. Co-authored-by: ohgeeceee <ohgeeceee@users.noreply.github.com>
Closes the CHANGELOG gap that PR #188 (v0.14.3 slice 4) flagged in the "Notes on the version surface" section. v0.14.1 and v0.14.2 shipped without CHANGELOG entries because each cycle's slice-closeout PR either forgot the version-surface sync step or deferred it as a separate housekeeping follow-up. This PR does the backfill from PR commit history: - ## [0.14.1] — 2026-07-27 - Tauri 2 `window.confirm()` auto-dismiss fix (PR #169, Tier B) - Simulator regenerate-on-identify (PR #169, Tier B) - Per-ECU freeze-schema split (PR #170, Tier A) Note: PR #169 shipped two slices in one PR (the dialog.js helper + the sim regenerate-on-identify). PR #170 is grouped under v0.14.1 because the ROADMAP treats the freeze-schema split as part of the v0.14.1 housekeeping arc (it was originally targeted at v0.14.0 but its tests-only refactor landed late and folded into the v0.14.1 PR #171 cycle-table retroactive close). - ## [0.14.2] — 2026-07-29 - Cycle plan + ROADMAP v0.14.2 header (PR #171, Tier A) - `community/profiles/n62.toml` enrichment — `0x5C` oil temp (PR #175, Tier A) - Live Data panel UX polish — poll-rate, peaks, range bar, snapshot-CSV, NRC error surface (PR #177, Tier A) - `docs/validation/n62-real-car.md` harness doc (PR #178, Tier A) - Claude review workflow repair — remove unsupported `Bash(gh pr review:*)` tool from `--allowedTools` (PR #176, Tier B) Note: the original v0.14.3 "Notes on the version surface" paragraph omitted PR #176 from the v0.14.2 PR list — fixed in this backfill. Also updates the v0.14.3 "Notes on the version surface" section to point at this backfill PR instead of flagging it as a backlog item, and includes PR #176 in the v0.14.2 PR list. Tier A — docs only. No code changes, no transport/** changes, no protocol/** changes. PR auto-merge eligible per CLAUDE.md once CI is green. Verification: - [x] CHANGELOG section order preserved: [0.14.0] (line 8) → [0.14.1] (line 71) → [0.14.2] (line 105) → [0.14.3] (line 168) → [0.13.0] (line 273) — chronological order matches merge order (verified via `gh pr list --state merged --json number,title,mergedAt`) - [x] Every PR number cited in a backfill entry exists and was actually merged to main (verified via `gh pr view N --json mergedAt` for PRs #169, #170, #171, #175, #176, #177, #178) - [x] All slice claims verified against each PR's actual body — no fabricated content per the data-over-invention rule - [x] `node --test src/js/*.test.js` — 163/163 pass (no code changes; 5 slice 3b tests absent because this branch is from origin/main pre-PR-190) - [x] `pytest backend/tests/` — 166/166 pass Cross-references: - PR #188 — v0.14.3 slice 4 (the cycle-closeout PR that flagged this backfill as the appropriate scope) - CLAUDE.md golden rule #5 — version-surface sync (the rule this PR enforces retroactively for v0.14.1 + v0.14.2) - docs/v0.14.3_plan.md — the cycle plan that calls out the forward-roadmap maintenance pattern this PR continues Co-authored-by: ohgeeceee <ohgeeceee@users.noreply.github.com>
Tier A, docs only. v0.14.5 slice 2 of 3. Closes the cycle. Mirrors the v0.14.2 N62 harness doc (docs/validation/n62-real-car.md, PR #178 + PR #188) and adapts it for the E9x N52 / N54 family that v0.14.5 slice 1 (PR #223) just enriched. The doc is the report-back loop an E9x owner runs on a real car to lift the `[needs verification, N5x/E9x bench]` markers PR #223 placed on the four new OBD-II PIDs (`0x5C` oil temp, `0x5E` fuel rate L/h, `0x5F` engine runtime, `0x62` fuel rate g/s). Five-section shape (mirrors the N62 harness doc): 1. What this is — the per-PID list, N52 BSD note, N54 charge-air / boost / HPFP context. 2. Step 1 — wire-up — K+DCAN cable on E9x (pin 6+14 D-CAN, pin 7 K-line fallback). 3. Step 2 — cold readings — 13 N52 PIDs + 15 N54 PIDs. Critical rows: oil temp (N52 BSD failure mode flagged), fuel rate at idle/WOT. 4. Step 3 — running readings — 13 N52 PIDs + 15 N54 PIDs. N54 ranges bumped for twin-turbo (WOT ~80-150 L/h vs N52's ~50-90 L/h). 5. Step 4 — report template — markdown block with chassis + firmware + cable + profile + per-state readings. 6. Step 5 — what we do with the report — passing report removes the verification markers; failing report reverts per-PID. **The N52-specific BSD-not-supported failure mode is documented explicitly:** if the N52 DME returns an NRC for `0x5C` on a given firmware, the protocol reverts the oil entry to `local:10` placeholder via the v0.14.3 PR #187 per-PID NRC surface + `remove_profile_pid` async Tauri command. The N52 BSD oil-condition sensor note is the load-bearing difference from the N62 harness doc. The N54-specific sections (charge-air / boost / HPFP rail / WOT fuel-rate ranges) are the N54-specific additions. No transport/**, protocol/**, commands.rs, or frontend changes. No new crates. No new BMW hex descriptions. No git tag v0.14.5 (Tier C release cut is the next step after this PR lands). Cross-references: v0.14.5 plan (PR #222), v0.14.5 slice 1 (PR #223), N62 cycle predecessors (PRs #175, #185, #186, #187, #188, #190, #208), docs/DECODE_FUNCTIONS.md § 3/10/11/12. Author note: commit authored with ohgeeceee@users.noreply.github.com to bypass GH007 (private-email push block). Content unchanged. Co-authored-by: ohgeeceee <ohgeeceee@users.noreply.github.com>
Summary
Slice 3 of v0.14.2 "Live Data on the Bench" — the
docs/validation/n62-real-car.mdharness doc, plus the ROADMAPv0.14.2 cycle table marked
✅ Donefor all four slices (thiscloses the cycle).
What's in this PR
New doc:
docs/validation/n62-real-car.mdChassis-specific step-by-step bench-verification harness for the
N62 / E70 X5 4.8L profile. Mirrors the shape of the existing
docs/validation/can-broadcast.md(PR #164),dtc-history.md(PR #148), and
injector-validation.md(PR #80) docs. Fivesections, each with copy-pasteable report-back shape:
ME9.2), BeeEmUu app, ignition-on or running session.
K-line fallback, connect + select
n62profile.table of 10 PIDs with the expected value at each. The
critical row is oil temp (
0x5C) — if it returns-40 °C(SAE J1979 sentinel for unsupported), the slice 1 enrichment
needs reverting for that PID.
warm-up table of the same 10 PIDs, with the N62
instrumentation context cross-linked (slow warm-up, oil-temp
cruise band, Valvetronic load/throttle inverse, idle-voltage
target). Each row pins the expected value at idle and the
plausible range.
template with cold + running reading tables and a freeform
section for the four N62-instrumentation observations.
report removes the
[needs verification]label from the0x5Centry in the next v0.14.x cut and is the gatingevidence for the v0.14.3+ work that re-enables the deferred
0x5E/0x5F/0x62PIDs. A failing report reverts theslice 1 enrichment for that PID only.
The doc explicitly cross-links the v0.14.0
docs/validation/can-broadcast.mdfor users who eventually getan OBDLink SX on the same chassis — both harnesses target the
same engine, just from different data paths (UDS diagnostic
services vs raw CAN broadcast frames).
ROADMAP.mdupdatesIn Progress→Shipped 2026-07-29.🔲 Open→✅ Done (PR #171 / #175 / #177 / #178). The slice-2 row's notes column gains ashort paragraph about the deferred per-PID dim +
remove-from-profile UI (the v0.14.3 protocol-layer change).
v0.14.2 closure summary.
Tier
A — pure docs. No
transport/**,protocol/**,commands.rs, orops/**touches. Auto-merge on CI green perCLAUDE.mdrule 2.Verification
node scripts/lint-toml.js— clean (no profile changes)docs/validation/files (CRLF); ROADMAP unchanged EOL
Diff stat
Cross-references
docs/v0.14.2_plan.md(slice 3 lines 75-92,142-151)
n62.toml), PR feat(v0.14.2): Live Data panel UX polish — poll-rate, peaks, range bar, snapshot, NRC #177 (slice 2 Live Data panel UX)community/profiles/n62.tomlheader block
docs/validation/can-broadcast.mddocs/validation/*.mddocs follow the sameharness shape; this doc is a chassis-specific instance of that
pattern.