Tag-pipeline ReadFn seam, dashboard fixes, MISS_HIT lint cleanup#367
Merged
Conversation
lineXRange indexed X(1)/X(end) on empty in-memory lines, and the render X/Y range loops left xmin/xmax (and ymin/ymax) at Inf/-Inf when every line was empty, so the subsequent XLim/YLim set threw. Surfaced by monitoring2 real mode, where an unreachable source yields zero-point sensors and the plot should simply come up blank. - lineXRange returns NaN for an empty in-memory line (NaN is inert in the min/max comparisons every caller runs, so the line contributes nothing). - render normalises the X and Y ranges to a finite, strictly increasing interval before applying limits (all-empty -> [0 1]; degenerate -> pad). Mock / non-empty rendering is byte-unchanged (new branches only fire on empty or degenerate data). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…Pipeline) Adds a readFn_ DI seam (symmetric to the existing writeFn_) so a caller can supply a parser for source formats the generic delimited reader cannot handle -- e.g. envlog's '%'-header + split dd.mm.yyyy/HH:MM:SS timestamp -- while still flowing through selectTimeAndValue_ + writeTagMat_ unchanged. Default is the production dispatchDelimitedParse_, so existing behavior is byte-identical. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
All-NaN sparkdata (e.g. a real-mode sensor with no samples feeding StaticValue/SparkData) made min/max NaN, so the axis-limit set threw "Value must be a 1x2 vector ... increasing". Guard yMin/yMax to a finite [0 1] fallback, keep the flat-data yRange guard, and clamp XLim to >=2 points. Mock/finite data is byte-identical. Caught by test_real_dashboards (odometer_hybif_sst) once MATLAB verification was available. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A SizeChangedFcn can fire while the figure is closing: the panel still passes ishandle() but render()'s new axes dies mid-build -> fill()/newplot threw "Argument must be a scalar handle". Guard on BeingDeleted and wrap the (purely cosmetic) relayout in try/catch. No effect on normal resize. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
DashboardWidgetRegistry.types() registers 19 canonical built-in widget types (verified at runtime in the live MATLAB session). The "21" came from counting *Widget*.m files, which includes the DashboardWidget abstract base class and the DashboardWidgetRegistry itself -- neither is a widget type. Fix all three occurrences (hero tagline, dashboard section, what's-in-the-box). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Safe whitespace/formatting fixes from mh_style --fix across benchmarks, demo, and install scripts. No logic changes (semicolon/colon spacing, duplicate/trailing blank lines, one useless line continuation). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… shadows Resolve the lint items mh_style --fix cannot auto-apply: - operator_after_continuation (8): move &&/+ to the end of the continued line in install.m and demo/ scripts (behavior-identical reflow). - builtin_shadow (9): rename locals that shadowed builtins — eps -> stamp (timestamp) in FileLock.m + AtomicWriter.m; toc -> pageToc / tocStruct in WikiBrowser.m, WikiPageIndex.m, test_wiki_page_index.m. mh_style + mh_lint now clean. test_wiki_page_index: 14/14 pass. Only FastSense.render() metric deviation (cyc 98>95, len 621>600) remains, flagged for a deliberate refactor. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…er lock) docs/.feature-ideas/ holds feature-scout's dated scratch notes and .claude/scheduled_tasks.lock is a transient scheduler lock; both kept dirtying the shared checkout, which forced the daily lint task into report-only mode. Untrack the lock and ignore both. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…eader-seam # Conflicts: # README.md
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
The empty-line render fix (b81ea6a) added two identical range-guard blocks to render(), pushing it past the CI metric limits (cyclomatic 98 > 95, length 621 > 600) — a regression this branch introduced (render is within limits on main). Extract the shared guard into a static helper normalizeFiniteRange and pull the X-range accumulation into computeFullXRange. Pure, behaviour-preserving refactor: render() drops back under both limits, the duplicated normalisation logic is deduplicated, and the empty / degenerate / normal render paths are unchanged. Verified: mh_style / mh_lint / mh_metric --ci all clean (677 files); test_render 8/8 pass; empty-line, single-point and normal renders produce finite, strictly-increasing limits. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Owner
Author
|
The auto-generated API reference ( The rest of this PR (dashboard empty-data fixes, MISS_HIT lint cleanup, Generated by Claude Code |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
ReadFn(BatchTagPipeline seam)mh_styleandmh_lintnow report zero issues (671 files). 12 auto-fixes (whitespace/blank lines) + 17 manual fixes (8 continuation-operator reflows, 9 builtin-shadow renames:eps→stamp,toc→pageToc/tocStruct)docs/.feature-ideas/,.claude/scheduled_tasks.lock) so automated sweeps stop finding a dirty treeVerification
mh_style/mh_lint: clean, 671 filescheckcodeon all renamed files: no new warningstest_wiki_page_index: 14/14 pass (exercises thebuildTocrenames end-to-end)Remaining known deviation (out of scope, flagged for a deliberate refactor):
FastSense.render()cyclomatic 98 > 95, length 621 > 600.🤖 Generated with Claude Code