You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
VersionCountTimeline uses a cleaned SemVer string as the Recharts series key, but the timeline data returned by the API remains keyed by the original version string. For valid versions containing build metadata, such as 3510.2.0+test, the generated series key becomes 3510.2.0 and no longer matches the data object.
The result is an empty chart series, a blank instance count, and 0.0% even though the API returned instances for that version.
Verified Upstream State
Repository: flatcar/nebraska
Branch inspected: main
Verified on latest upstream commit: ed76f06d27da9a8bd4fff34b1b0ecd843b5bd2ee
Still reproducible on upstream: Yes
The upstream branch was fetched immediately before reproduction; this is not caused by stale fork code.
Reproduction Evidence
I rendered the unmodified VersionCountTimeline component in Storybook with a mocked GroupChartsStore returning this valid timeline response:
The browser accessibility tree likewise contains a row for 3510.2.0 and 0.0, with no value in the Count cell.
Expected Behavior
The version should retain its identity throughout the reporting pipeline:
Version: 3510.2.0+test
Count: 7
Percentage: 100.0
A visible chart series backed by the raw API key
Build metadata variants such as 1.2.3+aws and 1.2.3+azure should not collapse into one series identity.
Actual Behavior
The frontend removes build metadata before creating the chart/table keys. It then looks up the cleaned key in an object that still contains only the raw key. The count becomes undefined, the total becomes NaN, and the percentage falls back to 0.0.
The reproduction story passes ESLint and a full Storybook production build on the verified commit.
Duplicate Search
Searches were run across open and closed issues, open and merged PRs, and default-branch commit messages.
Keywords used:
build metadata chart
semver metadata
version metadata chart
cleanSemverVersion
version +meta
metadata version breakdown
version chart
No exact duplicate or in-progress fix was found.
Related items reviewed:
#1451 / #1452 — version-breakdown percentages use the wrong SQL denominator when bracketed instance IDs are present. This report concerns frontend object-key identity for valid SemVer metadata.
#389 — an old Helm chart deployment produced a blank page because of a JSON parsing failure. It is unrelated to version values or Recharts data keys.
#1572 / #1573 — timeline components do not refetch when the selected group changes. PR Fix group timeline refetch on group change #1573 changes effect dependencies and cancellation behavior, but does not change raw-version/data-key mapping or SemVer metadata handling.
#1195 — multi-step package floors support nonstandard versions, but it does not cover reporting-chart rendering.
Because #1573 modifies VersionCountTimeline.tsx, an implementation for this issue should rebase after it if necessary. The two fixes are materially independent.
Suggested Fix
Preserve the raw API version string as the immutable chart/table identity and Recharts dataKey.
Separate series identity from presentation, for example:
Validate and order versions using semver, but do not replace the object key with a normalized display value.
When SemVer precedence compares equal because only build metadata differs, use the raw string as a deterministic secondary sort key.
Key the color map by the same raw identity used by the timeline data.
Display the full raw version, at least when multiple metadata variants share the same core version, so 1.2.3+aws and 1.2.3+azure remain distinguishable.
Add component regression tests covering:
a single build-metadata version;
two versions with the same core version and different metadata;
a prerelease version;
an ordinary Flatcar version without metadata.
Why This Matters
The version timeline is an operational reporting surface. Nebraska accepts and stores valid metadata-bearing versions, but the dashboard can silently turn their nonzero instance counts into blank/zero output. Operators could incorrectly conclude that a version has no instances or that a rollout has no data.
Description
VersionCountTimelineuses a cleaned SemVer string as the Recharts series key, but the timeline data returned by the API remains keyed by the original version string. For valid versions containing build metadata, such as3510.2.0+test, the generated series key becomes3510.2.0and no longer matches the data object.The result is an empty chart series, a blank instance count, and
0.0%even though the API returned instances for that version.Verified Upstream State
flatcar/nebraskamained76f06d27da9a8bd4fff34b1b0ecd843b5bd2eeReproduction Evidence
I rendered the unmodified
VersionCountTimelinecomponent in Storybook with a mockedGroupChartsStorereturning this valid timeline response:{ "2026-08-15T00:00:00Z": { "3510.2.0+test": 7 }, "2026-08-15T01:00:00Z": { "3510.2.0+test": 7 } }Observed output from the real component:
3510.2.0+test73510.2.00.0The browser accessibility tree likewise contains a row for
3510.2.0and0.0, with no value in the Count cell.Expected Behavior
The version should retain its identity throughout the reporting pipeline:
3510.2.0+test7100.0Build metadata variants such as
1.2.3+awsand1.2.3+azureshould not collapse into one series identity.Actual Behavior
The frontend removes build metadata before creating the chart/table keys. It then looks up the cleaned key in an object that still contains only the raw key. The count becomes
undefined, the total becomesNaN, and the percentage falls back to0.0.Code Locations and Root Cause
Timeline data preserves the raw API version key
frontend/src/components/Groups/GroupCharts/VersionCountTimeline.tsx:48-55For the fixture above, the resulting data object has a
3510.2.0+testproperty.Series discovery rewrites that key
frontend/src/components/Groups/GroupCharts/VersionCountTimeline.tsx:70-90cleanSemverVersionremoves everything following+:frontend/src/utils/helpers.ts:87-93The chart therefore receives
3510.2.0as itsdataKey, while its data still contains only3510.2.0+test.The table repeats the mismatched lookup
frontend/src/components/Groups/GroupCharts/VersionCountTimeline.tsx:107-132entries["3510.2.0"]is undefined because the entry is stored under3510.2.0+test.The backend explicitly accepts these versions
backend/pkg/api/internal/dbreads/helpers.go:24-30validates versions withblang/semver.backend/pkg/api/packages_floors_test.go:122-143contains supported fixtures including3510.2.0+testand3550.0.0+custom.This is therefore not malformed input being passed to an unsupported frontend path.
Steps to Reproduce Locally
Check out commit
ed76f06d27da9a8bd4fff34b1b0ecd843b5bd2eefromflatcar/nebraska.Save the reproduction harness below as:
frontend/src/components/Groups/GroupCharts/SemverMetadataRepro.stories.tsxInstall frontend dependencies and start Storybook:
cd frontend npm ci npm run storybook -- --host 127.0.0.1Open:
Compare the mocked payload at the top with the real component output below it.
Minimal Storybook reproduction harness
The reproduction story passes ESLint and a full Storybook production build on the verified commit.
Duplicate Search
Searches were run across open and closed issues, open and merged PRs, and default-branch commit messages.
Keywords used:
build metadata chartsemver metadataversion metadata chartcleanSemverVersionversion +metametadata version breakdownversion chartNo exact duplicate or in-progress fix was found.
Related items reviewed:
Because #1573 modifies
VersionCountTimeline.tsx, an implementation for this issue should rebase after it if necessary. The two fixes are materially independent.Suggested Fix
Preserve the raw API version string as the immutable chart/table identity and Recharts
dataKey.Separate series identity from presentation, for example:
Validate and order versions using
semver, but do not replace the object key with a normalized display value.When SemVer precedence compares equal because only build metadata differs, use the raw string as a deterministic secondary sort key.
Key the color map by the same raw identity used by the timeline data.
Display the full raw version, at least when multiple metadata variants share the same core version, so
1.2.3+awsand1.2.3+azureremain distinguishable.Add component regression tests covering:
Why This Matters
The version timeline is an operational reporting surface. Nebraska accepts and stores valid metadata-bearing versions, but the dashboard can silently turn their nonzero instance counts into blank/zero output. Operators could incorrectly conclude that a version has no instances or that a rollout has no data.