Skip to content

docs(v0.14.2): slice 3 — n62-real-car.md harness doc + ROADMAP cycle closeout - #178

Merged
github-actions[bot] merged 1 commit into
mainfrom
docs/v0.14.2-slice3-n62-harness
Jul 29, 2026
Merged

docs(v0.14.2): slice 3 — n62-real-car.md harness doc + ROADMAP cycle closeout#178
github-actions[bot] merged 1 commit into
mainfrom
docs/v0.14.2-slice3-n62-harness

Conversation

@ohgeeceee

Copy link
Copy Markdown
Owner

Summary

Slice 3 of v0.14.2 "Live Data on the Bench" — the
docs/validation/n62-real-car.md harness doc, plus the ROADMAP
v0.14.2 cycle table marked ✅ Done for all four slices (this
closes the cycle).

What's in this PR

New doc: docs/validation/n62-real-car.md

Chassis-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. Five
sections, each with copy-pasteable report-back shape:

  1. What you need — K+DCAN cable + E70/E60/E65 (all N62
    ME9.2), BeeEmUu app, ignition-on or running session.
  2. Step 1 — wire up — K+DCAN pin 6+14 for D-CAN, pin 7
    K-line fallback, connect + select n62 profile.
  3. Step 2 — capture the cold readings — key-on engine-off
    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.
  4. Step 3 — capture the running readings — idle / 10 min
    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.
  5. Step 4 — file the report — copy-pasteable GitHub issue
    template with cold + running reading tables and a freeform
    section for the four N62-instrumentation observations.
  6. Step 5 — what we will do with the report — a passing
    report removes the [needs verification] label from the
    0x5C entry in the next v0.14.x cut and is the gating
    evidence for the v0.14.3+ work that re-enables the deferred
    0x5E / 0x5F / 0x62 PIDs. A failing report reverts the
    slice 1 enrichment for that PID only.

The doc explicitly cross-links the v0.14.0
docs/validation/can-broadcast.md for users who eventually get
an 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.md updates

  • v0.14.2 cycle header: In ProgressShipped 2026-07-29.
  • All four cycle-table rows: 🔲 Open✅ Done (PR #171 / #175 / #177 / #178). The slice-2 row's notes column gains a
    short paragraph about the deferred per-PID dim +
    remove-from-profile UI (the v0.14.3 protocol-layer change).
  • The "Last updated" header line updated to 2026-07-29 with the
    v0.14.2 closure summary.

Tier

A — pure docs. No transport/**, protocol/**,
commands.rs, or ops/** touches. Auto-merge on CI green per
CLAUDE.md rule 2.

Verification

  • node scripts/lint-toml.js — clean (no profile changes)
  • No Rust or JS changes → no test impact
  • EOL parity: new doc matches the existing 6 docs/validation/
    files (CRLF); ROADMAP unchanged EOL

Diff stat

 ROADMAP.md                      |  12 +--
 docs/validation/n62-real-car.md | 206 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 212 insertions(+), 6 deletions(-)

Cross-references

…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>
@github-actions
github-actions Bot merged commit 8175540 into main Jul 29, 2026
9 of 10 checks passed
@github-actions

Copy link
Copy Markdown

🤖 Doc-only change — auto-merge enabled. Will merge once required checks pass.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread ROADMAP.md
| `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. |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge 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 👍 / 👎.

Comment on lines +73 to +75
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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment on lines +49 to +52
- 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"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment on lines +112 to +114
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:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment on lines +103 to +108
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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment on lines +188 to +191
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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment on lines +181 to +184
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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment on lines +68 to +72
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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge 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 👍 / 👎.

github-actions Bot pushed a commit that referenced this pull request Jul 29, 2026
…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>
github-actions Bot pushed a commit that referenced this pull request Jul 30, 2026
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>
github-actions Bot pushed a commit that referenced this pull request Aug 2, 2026
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant