Skip to content

docs(v0.12.0): mark Fault Memory cycle as Released in ROADMAP - #149

Merged
github-actions[bot] merged 1 commit into
mainfrom
docs/v0.12.0-cycle-closure
Jul 23, 2026
Merged

docs(v0.12.0): mark Fault Memory cycle as Released in ROADMAP#149
github-actions[bot] merged 1 commit into
mainfrom
docs/v0.12.0-cycle-closure

Conversation

@ohgeeceee

Copy link
Copy Markdown
Owner

What

Closes the v0.12.0 "Fault Memory" cycle on ROADMAP.md — mirrors the cycle-closure pattern v0.10.0 / v0.11.0 used:

Why

The slice 1 plan (docs/v0.12.0_plan.md) ends with the standard "Execution handoff" — every prior cycle (v0.8.0, v0.9.0, v0.10.0, v0.11.0) has landed a separate cycle-closure PR that flips the ROADMAP status from Started / Planned to Released and updates the slice table to reflect what shipped. This PR closes that loop.

What changed

  • ROADMAP.md+15 / -14 lines.
    • v0.12.0 header: PlannedReleased
    • 6 slice rows: 🔲 Open✅ Done (PR #N) with notes refreshed
    • 1 extra row added: the async-conversion fixup
    • Trailing dispatch-paragraph replaced with the cycle-closed summary
    • Ready-to-Claim paragraph: stale v0.11.0 reference replaced with v0.13.0 + accurate list of what's in the codebase

Verification

Tier

A — docs only, no Rust / commands.rs / transport / protocol change. Self-merge once required CI is green.

v0.12.0 progress — cycle fully closed

All 6 v0.12.0 "Fault Memory" slices shipped across 7 PRs (1 plan + 1 Rust + 4 frontend + 1 docs + this closure). Local JSONL at ~/beeemuu-exports/dtc-history.jsonl; opt-in toggle on the Fault memory panel; "seen before" callout under the DTC table; full user-facing doc. Zero new cloud deps, zero new crate deps, zero changes to transport/ or protocol/.

Unrelated working-tree noise (not in this PR)

Three files are modified locally but staged only my one intended file:

  • CLAUDE.md — your own rewrite (Tier C, yours to land)
  • frontend/index.html, frontend/schematics.html — the recurring third-party "network bar" injection (untrusted, not propagated)

Mirrors the cycle-closure pattern v0.10.0 / v0.11.0 used:

  - Header: v0.12.0 — 'Fault Memory' (Planned) -> (Released)
  - Slice table: every row -> 'Done (PR #N)' with the merged PR #
  - One extra row: the async-conversion fixup commit (caught by
    the tests/async_commands.rs allowlist on PR #147's CI run)
  - Closing summary line (cycle closed 2026-07-23, 6 PRs, no
    cloud deps, no crate deps, no transport/protocol changes)
  - 'Ready to Claim' section: refresh the stale 'active v0.11.0
    cycle' reference to point at the next cycle (v0.13.0) and
    note the v0.11.0 + v0.12.0 PRs that landed PNG/SVG/CSV/walkthrough
    /DTC history so the ready-to-claim list accurately reflects
    what's in the codebase.

Tier A — docs only. Self-merge when CI green.
@github-actions
github-actions Bot merged commit 7dd7fd1 into main Jul 23, 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: 912db0fb6c

ℹ️ 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
---

## v0.12.0 — "Fault Memory" (Planned)
## v0.12.0 — "Fault Memory" (Released)

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 mark v0.12.0 released before its release cut

At this commit, both package.json:3 and src-tauri/Cargo.toml:3 still declare version 0.10.0, and there is no v0.12.0 release-note or version-bump change. The repository also distinguishes a closed feature cycle from the Tier-C release cut, as demonstrated by the closed v0.11.0 cycle above remaining labeled Started. Labeling this cycle Released therefore tells users that a v0.12.0 build exists when only its feature slices have merged; keep it labeled as closed/started until the actual release cut lands.

Useful? React with 👍 / 👎.

Comment thread ROADMAP.md
| "Recurring DTC" callout in the DTC panel | 🔲 Open | A | The headline UI moment of the cycle. When `lastDtcs.length > 0`, queries history for the current VIN and renders a banner under the DTC table. Pure read, frontend only. |
| `docs/validation/dtc-history.md` harness doc | 🔲 Open | A | Same shape as `docs/validation/testplans.md` and `docs/validation/service-functions.md`: file location, line format, clear procedure, dedup window, "no VIN" caveat. |
| Cycle plan + ROADMAP v0.12.0 header | ✅ Done (PR #143) | A | `docs/v0.12.0_plan.md` + this ROADMAP entry. Docs-only. |
| `record_dtc_read` / `query_dtc_history` / `clear_dtc_history` Tauri commands | ✅ Done (PR #144) | **B** | Three additive commands in `commands.rs` only (no `transport/` / `protocol/` changes). Local JSONL appender at `~/beeemuu-exports/dtc-history.jsonl`. 60 s dedup window. Flagged `commands.rs` at the top of the PR body. |

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 Record the protocol change made by PR #144

PR #144 (e9ba6e3) was not limited to commands.rs: it also changed src-tauri/src/protocol/mod.rs to import Deserialize and derive it for Dtc so the new IPC argument can be decoded. Describing the slice as commands-only, and later claiming zero protocol changes, makes the shipped-history record factually incorrect and hides that a protected protocol path participated in this cycle; update both statements to mention the additive Dtc derive.

Useful? React with 👍 / 👎.

Comment thread ROADMAP.md
Comment on lines +371 to +372
in conflict with the active v0.13.0 cycle (or whatever the next
cycle lands on). (PNG/SVG export landed in v0.11.0 #131 / #136; CSV

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 claim an undefined v0.13.0 cycle is active

There is no v0.13.0 plan, header, or other v0.13.0 reference anywhere in this commit, so the Ready-to-Claim section cannot assert that its items do not conflict with an "active v0.13.0 cycle." The parenthetical acknowledging that the next cycle may be something else does not restore that conflict guarantee; refer neutrally to the next cycle until its scope is actually defined.

Useful? React with 👍 / 👎.

Comment thread ROADMAP.md
| `record_dtc_read` / `query_dtc_history` / `clear_dtc_history` Tauri commands | ✅ Done (PR #144) | **B** | Three additive commands in `commands.rs` only (no `transport/` / `protocol/` changes). Local JSONL appender at `~/beeemuu-exports/dtc-history.jsonl`. 60 s dedup window. Flagged `commands.rs` at the top of the PR body. |
| `src/js/dtc_history.js` pure module + tests | ✅ Done (PR #145) | A | Wraps the three Tauri commands. In-memory mock store for tests under `node --test`. Dual export (CommonJS + `window.beeemuuDtcHistory`). |
| Recording wired into `readFaults()` + opt-in toggle in Settings | ✅ Done (PR #146) | A | Hooks the existing `read_faults` invocation; toggles recording on/off; surfaces file path in the panel header; persists the toggle via the v0.7.0 `workspace.json`. |
| "Recurring DTC" callout in the DTC panel | ✅ Done (PR #147) | A | Headline UI moment of the cycle. When `lastDtcs.length > 0`, queries history for the current VIN and renders a banner under the DTC table. Pure read, frontend only. 14-day lookback; collapses occurrences across modules for the same code. |

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 VIN-less history from blending different cars

When the user has not clicked Read vehicle, renderHistoryCallout passes null as the current VIN, and group_history_lines treats a None filter as no filter at all, returning entries for every VIN in the shared history file. The supposedly completed callout can therefore tell a multi-car user that a fault was previously seen on the current car when it only occurred on another car. Suppress the callout until a VIN is known or make the null-VIN query select only null-VIN records before marking this slice done.

Useful? React with 👍 / 👎.

Comment thread ROADMAP.md
any time after slice 1.
(`COMMUNITY_FRAMEWORK.md` Rule 2).

**Cycle closed 2026-07-23.** All 6 v0.12.0 slices shipped across 6 PRs (#143, #144, #145, #146, #147, #148). "Fault Memory" — the cycle of making the app remember your car between sessions — is done. Local JSONL at `~/beeemuu-exports/dtc-history.jsonl`; opt-in toggle on the Fault memory panel; "seen before" callout under the DTC table. Zero new cloud deps, zero new crate deps, zero changes to `transport/` or `protocol/`.

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 cycle open until history clearing is wired

The v0.12.0 plan promises a confirmed Settings → Clear action for clear_dtc_history, but a repo-wide search at this commit finds no UI caller of clearDtcHistory; the shipped guide explicitly says there is no in-app button and calls it a follow-up. The toggle's status message nevertheless tells users to "Clear via Settings," leaving them with no such action. Track that follow-up as unfinished or wire the button before declaring every planned slice shipped.

Useful? React with 👍 / 👎.

Comment thread ROADMAP.md
| `record_dtc_read` / `query_dtc_history` / `clear_dtc_history` Tauri commands | ✅ Done (PR #144) | **B** | Three additive commands in `commands.rs` only (no `transport/` / `protocol/` changes). Local JSONL appender at `~/beeemuu-exports/dtc-history.jsonl`. 60 s dedup window. Flagged `commands.rs` at the top of the PR body. |
| `src/js/dtc_history.js` pure module + tests | ✅ Done (PR #145) | A | Wraps the three Tauri commands. In-memory mock store for tests under `node --test`. Dual export (CommonJS + `window.beeemuuDtcHistory`). |
| Recording wired into `readFaults()` + opt-in toggle in Settings | ✅ Done (PR #146) | A | Hooks the existing `read_faults` invocation; toggles recording on/off; surfaces file path in the panel header; persists the toggle via the v0.7.0 `workspace.json`. |
| "Recurring DTC" callout in the DTC panel | ✅ Done (PR #147) | A | Headline UI moment of the cycle. When `lastDtcs.length > 0`, queries history for the current VIN and renders a banner under the DTC table. Pure read, frontend only. 14-day lookback; collapses occurrences across modules for the same code. |

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 Restrict occurrence counts to the stated 14-day window

renderHistoryCallout queries history with since_iso: null, so Rust groups every occurrence ever recorded into each bucket; computeCallout then checks only whether the bucket's latest timestamp is within 14 days without removing older occurrences from its count. If a code has old history plus one recent occurrence, the completed UI reports the all-time total as having appeared "in the past 14 days." Pass the cutoff into queryDtcHistory or otherwise aggregate only in-window records before claiming a 14-day lookback.

Useful? React with 👍 / 👎.

Comment thread ROADMAP.md
| `record_dtc_read` / `query_dtc_history` / `clear_dtc_history` Tauri commands | ✅ Done (PR #144) | **B** | Three additive commands in `commands.rs` only (no `transport/` / `protocol/` changes). Local JSONL appender at `~/beeemuu-exports/dtc-history.jsonl`. 60 s dedup window. Flagged `commands.rs` at the top of the PR body. |
| `src/js/dtc_history.js` pure module + tests | ✅ Done (PR #145) | A | Wraps the three Tauri commands. In-memory mock store for tests under `node --test`. Dual export (CommonJS + `window.beeemuuDtcHistory`). |
| Recording wired into `readFaults()` + opt-in toggle in Settings | ✅ Done (PR #146) | A | Hooks the existing `read_faults` invocation; toggles recording on/off; surfaces file path in the panel header; persists the toggle via the v0.7.0 `workspace.json`. |
| "Recurring DTC" callout in the DTC panel | ✅ Done (PR #147) | A | Headline UI moment of the cycle. When `lastDtcs.length > 0`, queries history for the current VIN and renders a banner under the DTC table. Pure read, frontend only. 14-day lookback; collapses occurrences across modules for the same code. |

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 Exclude the current read from the seen-before decision

With history recording enabled, readFaults() awaits recordDtcRead before querying and rendering the recurring-DTC callout. A fault's first-ever observation is therefore appended and immediately returned as one matching occurrence, causing the "seen before" banner to appear even though there was no prior history. Query before recording or explicitly exclude the just-appended observation so this slice implements its stated recurring-fault behavior.

Useful? React with 👍 / 👎.

Comment thread ROADMAP.md
| `record_dtc_read` / `query_dtc_history` / `clear_dtc_history` Tauri commands | ✅ Done (PR #144) | **B** | Three additive commands in `commands.rs` only (no `transport/` / `protocol/` changes). Local JSONL appender at `~/beeemuu-exports/dtc-history.jsonl`. 60 s dedup window. Flagged `commands.rs` at the top of the PR body. |
| `src/js/dtc_history.js` pure module + tests | ✅ Done (PR #145) | A | Wraps the three Tauri commands. In-memory mock store for tests under `node --test`. Dual export (CommonJS + `window.beeemuuDtcHistory`). |
| Recording wired into `readFaults()` + opt-in toggle in Settings | ✅ Done (PR #146) | A | Hooks the existing `read_faults` invocation; toggles recording on/off; surfaces file path in the panel header; persists the toggle via the v0.7.0 `workspace.json`. |
| "Recurring DTC" callout in the DTC panel | ✅ Done (PR #147) | A | Headline UI moment of the cycle. When `lastDtcs.length > 0`, queries history for the current VIN and renders a banner under the DTC table. Pure read, frontend only. 14-day lookback; collapses occurrences across modules for the same code. |

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 Pass the selected module into the callout computation

The Dtc objects returned by read_faults contain no address, yet computeCallout decides same_address by comparing d.address with each history entry. Because renderHistoryCallout passes those raw DTCs without attaching selectedAddress, every real callout is labeled "different module," including history from the module currently being read. Supply the selected address separately or decorate the current DTCs before marking the cross-module behavior done.

Useful? React with 👍 / 👎.

Comment thread ROADMAP.md
| `record_dtc_read` / `query_dtc_history` / `clear_dtc_history` Tauri commands | ✅ Done (PR #144) | **B** | Three additive commands in `commands.rs` only (no `transport/` / `protocol/` changes). Local JSONL appender at `~/beeemuu-exports/dtc-history.jsonl`. 60 s dedup window. Flagged `commands.rs` at the top of the PR body. |
| `src/js/dtc_history.js` pure module + tests | ✅ Done (PR #145) | A | Wraps the three Tauri commands. In-memory mock store for tests under `node --test`. Dual export (CommonJS + `window.beeemuuDtcHistory`). |
| Recording wired into `readFaults()` + opt-in toggle in Settings | ✅ Done (PR #146) | A | Hooks the existing `read_faults` invocation; toggles recording on/off; surfaces file path in the panel header; persists the toggle via the v0.7.0 `workspace.json`. |
| "Recurring DTC" callout in the DTC panel | ✅ Done (PR #147) | A | Headline UI moment of the cycle. When `lastDtcs.length > 0`, queries history for the current VIN and renders a banner under the DTC table. Pure read, frontend only. 14-day lookback; collapses occurrences across modules for the same code. |

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 Clear stale callouts when a read returns no faults

After a callout has been displayed, selecting a fault-free module makes readFaults() return from the empty-DTC branch before renderHistoryCallout gets a chance to hide and clear the existing banner; read failures have the same problem. The old module's "seen before" result consequently remains visible beneath a table that now says no faults are stored. Hide the callout at the start of each read, including empty and failure paths, before treating the DTC-panel integration as complete.

Useful? React with 👍 / 👎.

@ohgeeceee
ohgeeceee deleted the docs/v0.12.0-cycle-closure branch July 23, 2026 05:31
ohgeeceee pushed a commit that referenced this pull request Jul 23, 2026
…sion-sync rule to CLAUDE.md

README.md badge line 18 was frozen at v0.6.0 even though v0.7.0
through v0.14.0 have all shipped (or in v0.14.0's case, had their
plan merged).  Three changes:

- README.md: bump release badge to v0.14.0, point at CHANGELOG.md.
- CHANGELOG.md: backfill [0.12.0] (Fault Memory cycle, PRs #143-#149
  plus the async fix), [0.13.0] (Real Reads Real Long, PRs #150-#153
  including the plan correction), [0.14.0] (Live CAN plan only,
  PR #156).  Existing [0.11.0] and older sections untouched.
- CLAUDE.md: add golden rule #6 — every release PR must bump both
  the README badge and the CHANGELOG section in lockstep, so the
  badge can't drift again.  Plan-only cycles use CHANGELOG `### Planned`
  and leave the README badge alone.

pytest backend/tests/ → 151/151 green.  No code change, so cargo test
and the JS suites are unaffected.
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