docs(v0.12.0): mark Fault Memory cycle as Released in ROADMAP - #149
Conversation
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.
|
🤖 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: 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".
| --- | ||
|
|
||
| ## v0.12.0 — "Fault Memory" (Planned) | ||
| ## v0.12.0 — "Fault Memory" (Released) |
There was a problem hiding this comment.
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 👍 / 👎.
| | "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. | |
There was a problem hiding this comment.
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 👍 / 👎.
| 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 |
There was a problem hiding this comment.
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 👍 / 👎.
| | `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. | |
There was a problem hiding this comment.
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 👍 / 👎.
| 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/`. |
There was a problem hiding this comment.
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 👍 / 👎.
| | `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. | |
There was a problem hiding this comment.
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 👍 / 👎.
| | `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. | |
There was a problem hiding this comment.
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 👍 / 👎.
| | `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. | |
There was a problem hiding this comment.
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 👍 / 👎.
| | `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. | |
There was a problem hiding this comment.
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 👍 / 👎.
…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.
What
Closes the v0.12.0 "Fault Memory" cycle on
ROADMAP.md— mirrors the cycle-closure pattern v0.10.0 / v0.11.0 used:v0.12.0 — "Fault Memory" (Planned)→(Released)tests/async_commands.rsallowlist guard against the slice-2 commands' initial sync shape; follow-up commit converted them toasync fn+spawn_blocking)active v0.11.0 cyclereference 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.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 fromStarted/PlannedtoReleasedand updates the slice table to reflect what shipped. This PR closes that loop.What changed
ROADMAP.md— +15 / -14 lines.Planned→Released🔲 Open→✅ Done (PR #N)with notes refreshedVerification
git diff --stat origin/main→ROADMAP.md | 29 +++++++++++++++--------------(+15/-14, single file, no churn)## vX.Y.Z — "Name" (Released)header, ✅-row slice table, closing bold-paragraph summary line.mainbefore this closure PR opened.git log origin/mainfor the v0.12.0 series.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 totransport/orprotocol/.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)