Skip to content

feat(v0.14.5): n52 + n54 — swap local:10 oil for obd:5C + add 3 fuel-rate / runtime PIDs - #223

Merged
github-actions[bot] merged 1 commit into
mainfrom
feat/v0.14.5-n5x-profile-enrichment
Aug 2, 2026
Merged

feat(v0.14.5): n52 + n54 — swap local:10 oil for obd:5C + add 3 fuel-rate / runtime PIDs#223
github-actions[bot] merged 1 commit into
mainfrom
feat/v0.14.5-n5x-profile-enrichment

Conversation

@ohgeeceee

Copy link
Copy Markdown
Owner

Summary

Tier A, data only. v0.14.5 slice 1 of 3. Generalises the
v0.14.2 N62 slice 1 (PR #175) and v0.14.3 N62 slice 2 (PR
#186) pattern to the N52 / N54 E-series family that the
existing community profiles already cover but that v0.14.2
explicitly deferred to "the next cycle after N62 wraps up."

What this PR adds

For each of the two profile files, the same 4-entry
enrichment:

  1. Oil-temp swap — replace the unverified local:10
    placeholder (labelled [UNVERIFIED placeholder]) with
    the standard SAE J1979 PID 0x5C (engine oil temperature,
    byte - 40 °C, decoder temp_u8).
  2. Three new PIDs0x5E fuel rate L/h (u16_fiftieths,
    v0.14.3 PR feat(v0.14.3): three new decoders — u16_fiftieths, u32_be, u16_half #185), 0x5F engine runtime s (u32_be),
    0x62 fuel rate g/s (u16_half). All SAE J1979
    emissions-mandated. All four decoders already shipped in
    v0.14.3 PR feat(v0.14.3): three new decoders — u16_fiftieths, u32_be, u16_half #185.
  3. Each new entry carries the
    [needs verification, N5x/E9x bench] label marker per
    the v0.14.3 N62 discipline.
  4. Profile label field[community, oil temp unverified] -> [community] once 0x5C is in (matching
    the v0.14.2 N62 PR feat(v0.14.2): n62.toml — swap local:10 oil placeholder for OBD-II 0x5C #175 pattern). The [community]
    conservative-sourcing marker stays until a real-car
    verification report lifts it.

Per-file changes

community/profiles/n52.toml (10 -> 13 params)

  • Oil entry: local:10 -> obd:5C; label
    Oil temp [UNVERIFIED placeholder] -> Oil temp
  • Added fuel_rate_lh (0x5E), engine_runtime (0x5F),
    fuel_rate_gs (0x62) with [needs verification, N52/E9x bench] markers
  • Profile label: N52 2.5/3.0 NA I6 (MSV70/MSV80) [community, oil temp unverified] -> N52 2.5/3.0 NA I6 (MSV70/MSV80) [community]
  • Header block: BSD oil-condition sensor note (N52's
    known oil-temp quirk — DME reads oil condition via BSD,
    not KWP2000; the OBD-II 0x5C swap is the surface the
    desktop app reads, but the harness-doc path reverts to
    local:10 if the DME returns an NRC for 0x5C).
    Valvetronic + oil-temp cruise band + idle voltage
    context added.

community/profiles/n54.toml (12 -> 15 params)

  • Oil entry: local:10 -> obd:5C; label
    Oil temp [UNVERIFIED placeholder] -> Oil temp
  • Added fuel_rate_lh (0x5E), engine_runtime (0x5F),
    fuel_rate_gs (0x62) with [needs verification, N54/E9x bench] markers
  • Profile label: N54 3.0 twin-turbo I6 (MSD80/81) [community, oil temp unverified] -> N54 3.0 twin-turbo I6 (MSD80/81) [community]
  • Header block: BSD note + charge-air / boost / HPFP /
    idle-voltage context (N54-specific). Fuel-rate ranges
    bumped to ~80-150 L/h and ~60-100 g/s
    at WOT (twin-turbo
    pulls more fuel than the NA N52 / N62 — the BSFC heuristic
    over RPM × cyl_count reflects this).

No Rust change

All four OBD-II PIDs reuse decoders that shipped in v0.14.3
PR #185 (temp_u8, u16_fiftieths, u32_be, u16_half).
Zero changes to src-tauri/**. No new crate, no new
#[tauri::command], no protocol/** change, no
commands.rs change, no frontend change.

The N52 BSD-not-supported failure mode

N52 oil condition is primarily communicated via the BSD
(Bit Serial Data) protocol from the oil condition sensor to
the DME, not over KWP2000. The OBD-II 0x5C swap is the
path the v0.14.2 + v0.14.3 + v0.14.5 N62 cycle established
and is the right surface to attempt. If the N52 DME returns
an NRC (0x11 serviceNotSupported or 0x12 subFunctionNotSupported) for 0x5C on a given firmware,
the v0.14.3 PR #187 per-PID NRC surface flags it in the UI
and the remove_profile_pid async Tauri command writes the
updated TOML behind a tauri-plugin-dialog confirmation
per the issue-#161 fix pattern. The harness doc (v0.14.5
slice 2) documents the failure-mode protocol.

Tier

A per CLAUDE.md — community data + docs. No
transport/**, no protocol/**, no commands.rs, no
src-tauri/Cargo.toml, no src/js/**, no src/css/**, no
src/index.html. Auto-merge eligible once required CI
checks pass.

Verification (pre-merge)

  • python tomllib.load() on both files — 13 / 15
    params parse cleanly; all new entries have the
    [needs verification, N5x/E9x bench] label marker
  • git diff --cached --stat — 2 files, 248 insertions,
    25 deletions (no phantom diff from line-ending
    normalization — CRLF on disk matches the committed
    blob, verified per the v0.14.3 slice 4 lessons' CRLF
    stat-noise trap)
  • git ls-files --stage vs git ls-tree HEAD
    staged blob SHAs differ for both modified files
    (n52.toml staged bac4004b vs head 473c239f;
    n54.toml staged bcc71748 vs head 07868a10); no
    no-op commit
  • Branched off origin/main @ 8a71a99 (the v0.14.5
    slice-0 commit), NOT off the local main ref
  • Author ohgeeceee@users.noreply.github.com (GH007
    bypass; content unchanged)
  • git status clean post-commit (no untracked files
    in the staged diff, no other modifications)

Cross-references

Diff stat

 community/profiles/n52.toml | 128 +++++++++++++++++++++++++++++++++++---
 community/profiles/n54.toml | 145 +++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 248 insertions(+), 25 deletions(-)

Author note

Commit authored with ohgeeceee@users.noreply.github.com to
bypass GH007 (private-email push block). Content unchanged.

…rate / runtime PIDs

Tier A, data only. v0.14.5 slice 1 of 3.

Mirrors the v0.14.2 N62 slice 1 (PR #175) and the v0.14.3 N62
slice 2 (PR #186) pattern: swap the unverified `local:10`
oil-temp placeholder for the standard SAE J1979 PID `0x5C`,
then add the three v0.14.3 PIDs (0x5E fuel rate L/h,
0x5F engine runtime, 0x62 fuel rate g/s). Each new entry
carries the `[needs verification, N5x/E9x bench]` marker
per the v0.14.3 N62 discipline.

Changes per file:

n52.toml:
  - oil placeholder: `local:10` (labelled `[UNVERIFIED
    placeholder]`) -> `obd:5C` (engine oil temperature,
    `byte - 40 °C`, decoder `temp_u8`)
  - 3 new entries: fuel_rate_lh (0x5E), engine_runtime
    (0x5F), fuel_rate_gs (0x62)
  - profile label: `[community, oil temp unverified]` ->
    `[community]` (the conservative-sourcing marker stays
    until a real-car report lifts it)
  - header block: BSD oil-condition sensor note (N52's known
    oil-temp quirk — DME reads oil condition via BSD, not
    KWP2000; the OBD-II `0x5C` swap is the surface the desktop
    app reads, but the harness-doc path reverts to `local:10`
    if the DME returns an NRC for `0x5C`)
  - 10 -> 13 [[profile.param]] entries

n54.toml:
  - same oil placeholder swap + 3 new entries
  - profile label: `[community, oil temp unverified]` ->
    `[community]`
  - header block: BSD note + charge-air / boost / HPFP /
    idle-voltage context (N54-specific; twin-turbo pulls more
    fuel at WOT than the NA N52 / N62 — fuel-rate ranges
    bumped to ~80-150 L/h and ~60-100 g/s)
  - 12 -> 15 [[profile.param]] entries

No Rust change. All four OBD-II PIDs reuse decoders that
shipped in v0.14.3 PR #185 (temp_u8, u16_fiftieths, u32_be,
u16_half). The v0.14.3 PR #187 per-PID NRC surface flags the
N52 / N54 `0x5C` BSD-not-supported failure mode in the UI;
the `remove_profile_pid` async command writes the updated
TOML behind a tauri-plugin-dialog confirmation per the
issue-#161 fix pattern.

Bench verification on the E9x is the gating step — see
`docs/validation/n5x-real-car.md` (v0.14.5 slice 2).

Author note: commit authored with
ohgeeceee@users.noreply.github.com to bypass GH007
(private-email push block). Content unchanged.
@github-actions
github-actions Bot merged commit 61d5df8 into main Aug 2, 2026
14 of 15 checks passed
@github-actions
github-actions Bot deleted the feat/v0.14.5-n5x-profile-enrichment branch August 2, 2026 06:06
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>

@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: e47ffb1224

ℹ️ 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 on lines +207 to +208
query = "obd:5F"
decode = "u32_be"

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 Use PID 0x1F for engine runtime

On any SAE J1979-compliant ECU, PID 0x5F reports the vehicle's emissions-requirement category rather than engine runtime; runtime since start is PID 0x1F and is a two-byte seconds value. Because read_obd_pid strips the service and PID bytes and u32_be requires four data bytes, this gauge will produce no value for both the N52 profile here and the duplicated N54 entry. Query obd:1F with the appropriate two-byte decoder and range instead.

Useful? React with 👍 / 👎.

Comment on lines +226 to +227
query = "obd:62"
decode = "u16_half"

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 Use PID 0x9D for mass fuel rate

On SAE J1979 ECUs, PID 0x62 is actual engine percent torque, encoded as one byte with an offset, not fuel rate in g/s. Consequently, the two-byte u16_half decoder returns no value for this new N52 gauge and the matching N54 gauge; if mass fuel rate is intended, its standard PID is 0x9D, encoded as a two-byte value scaled by 0.02 g/s rather than 0.5.

Useful? React with 👍 / 👎.

Comment on lines 89 to +90
id = "oil"
label = "Oil temp [UNVERIFIED placeholder]"
label = "Oil temp"

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 Keep the oil-temperature entry marked unverified

For users selecting either newly changed N5x profile before the stated E9x bench verification has occurred, this removes the only visible warning from the oil-temperature gauge even though the adjacent comment explicitly says support for PID 0x5C is unverified and may require reverting after an NRC. The other unbenchmarked additions retain [needs verification] in their labels, and these labels propagate into gauges and exports, so the N52 and N54 oil labels should retain the same qualification until real-car support is confirmed.

Useful? React with 👍 / 👎.

github-actions Bot pushed a commit that referenced this pull request Aug 2, 2026
…refresh (#225)

Tier C release cut for the v0.14.5 'Open & Committed' cycle.
Per CLAUDE.md golden rule #5 ('don't let the badge lie'),
the README release badge moves from v0.14.4 to v0.14.5
because v0.14.5 did ship real work (3 Tier A slices:
cycle plan + N5x profile enrichment + N5x harness doc).

All three cycle slices merged on origin/main @ ec69fcf:
- PR #222 (cycle plan + ROADMAP header + CHANGELOG section)
- PR #223 (N52 + N54 profile enrichment)
- PR #224 (n5x-real-car.md harness doc)

## Version bump (0.14.4 -> 0.14.5)

- package.json: 0.14.4 -> 0.14.5
- src-tauri/Cargo.toml: 0.14.4 -> 0.14.5
- src-tauri/tauri.conf.json: 0.14.4 -> 0.14.5
- src-tauri/Cargo.lock: refreshed via cargo update -p
  beeemuu; beeemuu package version bumped to 0.14.5.
  The productName stays 'BeeEmUu' and the identifier
  stays 'com.beeemuu.diag'.
- README.md: release badge from v0.14.4 to v0.14.5.

## CHANGELOG.md

- ## [0.14.5] - Unreleased -> ## [0.14.5] - 2026-08-02.
- Cycle status blockquote rewritten: 'slice 0 in flight'
  + 'Slices 1 + 2 are open' -> 'all three slices merged
  (PRs #222, #223, #224). The v0.14.5 release cut is
  this PR; the git tag step runs after merge.'
- ### Planned - Tier A surface -> ### Added - Tier A
  surface (cycle is shipping, not just planned).
- ## [0.14.4] - Unreleased -> ## [0.14.4] - 2026-07-31
  (the date the v0.14.4 release cut actually shipped,
  per the v0.14.4 PR #208 commit 4de03ee).
- The v0.14.4 status blockquote now correctly describes
  the v0.14.4 release cut as shipped (the previous
  'Until that PR lands, this entry stays Unreleased'
  blockquote fragment is removed).

## docs/v0.14.5_plan.md

- Original 'Status' blockquote renamed to
  'Status (original 2026-08-02)' to preserve the
  cycle-opening history.
- New 'Update 2026-08-02 (this release cut)' blockquote
  added below: all three slices merged on origin/main
  at ec69fcf; cycle is code-side closed; the
  'git tag v0.14.5 && git push --tags' step runs
  after this PR merges.

## Tier

C per CLAUDE.md - 'Releases: version bumps, git tags,
publishing installers.' Per CLAUDE.md Tier C rules:
'always a human decision (propose, never execute).'
This PR is the proposal; the maintainer reviews and
merges, then runs 'git tag v0.14.5 && git push --tags'
to trigger release.yml for the actual installer
publish + landing-page deploy.

Per the user's direction ('commit and push all' +
'i approve all'), the agent will proceed to tag +
push + watch release.yml + promote the draft release
on the user's behalf once this PR lands. The user
retains veto at any step.

## Verification (pre-cut)

- node --test src/js/test/*.test.cjs: 58/58 pass (186ms)
- node --test src/js/*.test.js: 192/192 pass (879ms)
- python -m pytest backend/tests/ -q: 218/219 pass
  (the 1 failure is test_bootstrap_cli.py::test_script_
  exists_and_is_executable, which asserts the executable
  bit on ops/bootstrap-admin.sh; on Windows the
  executable bit is meaningless, so this test always
  fails on Windows by design. Pre-existing on
  origin/main, not caused by this PR. The CI matrix
  runs on ubuntu-latest where the bit works. Tracked
  in PR body as 'Findings flagged (NOT fixed in this
  PR)' per the v0.14.3 slice-4 lessons' rule.)
- cargo test --test async_commands --offline:
  (running in background; CLAUDE.md invariant guard)
- git diff --stat -- src-tauri/Cargo.toml: +2/-2
  (the -0.14.4 line + the +0.14.5 line); same for
  package.json and tauri.conf.json (the byte-equality
  recipe per commit-discipline confirms the version
  string actually changed)
- git diff --stat -- src-tauri/Cargo.lock: +2/-2
  (the lockfile version bumped from 0.14.4 to 0.14.5
  after cargo update -p beeemuu; 0 packages re-locked,
  no transitive changes)
- git ls-files --stage vs git ls-tree HEAD: staged
  blob SHAs differ for all 7 modified files; no no-op
  commit
- git status clean post-stage; no other modifications,
  no untracked files (pr_body_v0.14.5_release.md is
  a PR body artifact, not source)

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>
github-actions Bot pushed a commit that referenced this pull request Aug 2, 2026
…landing page closeout (#226)

Tier A, docs only. v0.14.6 "Forward Roadmap Audit" — the
single-slice doc-rotation close-of-cycle that the
v0.14.5 release cut (PR #225) should have caught but
didn't. Mirrors the v0.14.4 "Story Coverage" docs-
rotation pattern (PRs #198 + #200: CLAUDE.md invariants
refresh + ROADMAP v0.3.0 historical audit).

## What this PR adds

Six files changed:

- ROADMAP.md: v0.14.5 cycle block "In Progress - slice 0"
  -> "Shipped 2026-08-02" with Done rows for PRs
  #222, #223, #224 + the Tier C release cut #225. Adds
  a "Test count delta" table, a "Verification
  (close-of-cycle)" section, and a "Next cycle"
  pointer to v0.14.6.

- docs/forward_roadmap_14.4_to_16.9.md: full audit
  against main @ 5743348 (the post-#225 v0.14.5
  release tip). Updated "Status (revised)" blockquote
  to add the 4 cycles (v0.14.2 / v0.14.3 / v0.14.4 /
  v0.14.5) that have closed since the 2026-07-29
  revision. Closed out the v0.14.4 entry (renamed
  "N62 Bench Verification" -> "Story Coverage") and
  the v0.14.5 entry (renamed "Bench Round 2" ->
  "Open & Committed"). Added the v0.14.6 entry at the
  top of the cycle list. Updated the v0.15.0 entry's
  status blockquote. Preserved the v0.15.1 / v0.15.2
  / v0.15.3 / v0.15.4 / v0.16.0 - v0.16.9 cycle list
  as forward-looking candidates. Added a 4th badge
  state (Shipped) to the legend. Added the v0.14.5
  N5x harness doc to the cross-cutting list. Updated
  the "Open questions" section. Added a "2026-08-02
  (v0.14.6 audit)" entry to the Revision history.

- docs/v0.14.6_plan.md (new, ~270 LOC): the v0.14.6
  cycle plan doc per the established
  docs/v0.14.x_plan.md convention. Includes premise,
  slice list, tier split, execution order, "what this
  cycle does NOT ship" claim, open questions for the
  maintainer, cross-references.

- frontend/roadmap/v0.14.5.html: public landing-page
  closeout. Title (planned) -> (shipped), eyebrow ->
  "Cycle detail (shipped)", lede rewritten to point
  at the shipped state + link to the v0.14.5 release
  page, guide-meta updated, the candidate-slice list
  replaced with a "What shipped" section listing the
  4 PRs that merged, an "Install v0.14.5" section
  with direct download links to the Windows
  installers + the SHA-256 verify link + the safety
  warning, and FAQ answers updated.

- frontend/roadmap/index.html: v0.14.5 moved from
  "Planned cycles" to "Shipped cycles" with the 4-PR
  summary. v0.14.6 added to "Planned cycles" with
  the 1-slice summary.

- frontend/roadmap/v0.14.6.html (new): the public
  v0.14.6 cycle detail page. Single-slice (the
  Forward Roadmap Audit), planned state. Open
  questions section with the two maintainer
  decisions (separate v0.14.6 release cut? fix the
  release.yml landing-page step?).

## Why "Forward Roadmap Audit" is the cycle name

It matches the v0.14.4 "Story Coverage" docs-rotation
pattern (PRs #198 + #200) and the v0.14.2 / v0.14.3
pattern of close-out cycles that consume the post-
release docs-rot. The v0.14.5 release cut (PR #225)
shipped three Tier A slices + the Tier C release
cut but left 4 docs-rot findings on main that need
a follow-up cycle:

1. ROADMAP.md v0.14.5 cycle block still said
   "In Progress - slice 0"
2. docs/forward_roadmap_14.4_to_16.9.md named
   v0.14.4 as "N62 Bench Verification" (actual:
   "Story Coverage") and v0.14.5 as "Bench Round
   2" (actual: "Open & Committed")
3. The public frontend/roadmap/v0.14.5.html
   still claimed v0.14.5 was "Planned" / "Tier TBD"
4. The forward-roadmap doc + the public landing-
   page cycle detail were out of sync

This PR closes all four findings.

## Tier

A per CLAUDE.md - docs only, no transport/**, no
protocol/**, no commands.rs, no
src-tauri/Cargo.toml, no src/js/**, no src/css/**,
no src/index.html. The frontend/roadmap/v0.14.5.html
+ v0.14.6.html updates are landing-page content
changes (not app-shell JS / CSS changes). Auto-merge
eligible once required CI checks pass.

## Verification (pre-merge)

- git diff --cached --stat: 6 files, 1136 insertions,
  560 deletions (no phantom diff from line-ending
  normalization; verified per the v0.14.3 slice-4
  lessons' CRLF stat-noise trap - the 2 new files
  were normalized to CRLF on disk before git add,
  which then normalized them to LF in the index,
  matching the committed-blob convention)
- git ls-files --stage vs git ls-tree HEAD: all 4
  modified files have DIFFERENT staged blob SHAs
  from HEAD (no phantom commit); the 2 new files
  have legitimate new blob SHAs
- Branched off origin/main @ 5743348 (the post-#225
  v0.14.5 release tip), NOT off the local main ref
  (the multi-writer skill's "local main can be stale"
  trap)
- Working tree clean post-stage; no other
  modifications, no untracked files
- Author ohgeeceee@users.noreply.github.com
  (GH007 bypass; content unchanged)

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