NORTHSET
Proof-of-Pass Receipt
Receipt ID M-031
ISSUE / WORK[bug]: Tooltip donut legend omits zero-value series (should show n/a) · PR #226
CONTRIBUTOR SELF-RUN — NOT MAINTAINER VERIFICATION
RUN→
01 / TECHNICAL RESULT
Technical result
declared commands passed
Recorded on the named code in the named execution environment. The evidence annex carries the exact scope.
- Upstream
- MERGEDmutable external state
- Attempts
- 10 totalcurrent
M-031· #10 - Cost record
- PARTIALunpriced
02 / RECORDED WORK SEQUENCE
Northset Proofline
Every task-bound attempt is shown in recorded order. Anatomy geometry follows each non-null elapsed duration’s share; labels retain exact recorded time.
- ATTEMPTS 1–6
M-022 → M-0276× FAILED ORACLEverification - ATTEMPT 7
M-028FAILED AUTHORauthoring - ATTEMPT 8
M-029STALEprecondition drift - ATTEMPT 9
M-030FAILED AUTHORauthoring - ATTEMPT 10
M-031READY
ATTEMPT 10 / EXECUTION ANATOMY
03 / ECONOMIC NARRATIVE
Economic identity
Observed sponsorship, authorization, scope, transfer, and outcome. No estimates or inferred value.
01 / MANDATE
Sponsored and authorized
The recorded mandate names both its sponsor and initiative, with authorization tied to a named approver and approval time.
02 / WORK
Demand became scoped work
An external issue invitation became a stable task and a recorded code-and-test scope, without treating scope as a measure of value.
03 / EXTERNAL OUTCOME
Transfer and upstream state
The recorded maintainer transfer and its contingency are separate from upstream state, which remains a mutable external observation.
04 / COST COMPLETENESS
Known, unknown, and unpriced
Known: maintainer payment was none. A known zero external transfer is not a zero total cost.
Missing or unpriced components
- model inference
- actual host compute
- human review
- shared tooling
No complete total is recorded; see the missing or unpriced component record above.
Evidence annexEconomic · technical · provenance · limitations
01Economic evidence
Lineage, usage, caps, outcome, and cost provenance
Economic evidence
Lineage, usage, caps, outcome, and cost provenanceAttempt lineage
M-022attempt 1 · FAILED ORACLE · verificationM-023attempt 2 · FAILED ORACLE · verificationM-024attempt 3 · FAILED ORACLE · verificationM-025attempt 4 · FAILED ORACLE · verificationM-026attempt 5 · FAILED ORACLE · verificationM-027attempt 6 · FAILED ORACLE · verificationM-028attempt 7 · FAILED AUTHOR · authoringM-029attempt 8 · STALE · precondition driftM-030attempt 9 · FAILED AUTHOR · authoringM-031attempt 10 · READY
Recorded usage
- requested reviewer model
- gpt-5.6-sol
- actual reviewer model
- not captured
- requested author model
- gpt-5.6-sol
- actual author model
- not captured
- networked setup phase
- 3m10s
- install-only duration
- not captured
- declared commands
- 1m40s
- unclassified executor time
- 51s
- CPU time
- not captured
- peak RSS
- not captured
Configured resource envelope
- CPU cap
- 6
- memory cap
- 6144 MB
- PID cap
- 512
- command wall cap
- 2700s
- output cap / stream
- 2000000 bytes
Configured limits are an envelope, not observed consumption.
Cost lines
- maintainer paymentobserved quantity unpriced · 0 external transfer · amount unavailable
Cost status: partial. Values without source-backed quantities and rates remain null.
Outcome facts
- technical checks passed
- true
- PR opened
- true
- CI
- success
- merged
- true
- accepted as submitted
- true
- external cycle time
- 131m12s
- released
- not observed
- deployed
- not observed
- business result
- not observed
02Technical evidence
Code, environment, exact commands, patch, and outputs
Technical evidence
Code, environment, exact commands, patch, and outputsProject
Work
[bug]: Tooltip donut legend omits zero-value series (should show n/a) · PR #226
Verification execution
runtime: northset-oss executor v1
human operator: aeziz
Code
- base
487ab430e17b0aa2868b33b9667c1676e6efd3be- recorded patch commit
689279e546d071f37a8e1219898dd8ee693586ef
declared metadata; not execution-bound- patch diff SHA-256
sha256:4a1d0e072bc383e95a7307d2955d2d8e6215e7fe73e7c28fee67c845e40a1352
bound to executed patch bytes
Environment
- image reference
- node@sha256:5647be709086c696ff32edaaf1c70cd26d1da6ab2b39c32f3c7b4c4a31957e37
- repository digest
node@sha256:5647be709086c696ff32edaaf1c70cd26d1da6ab2b39c32f3c7b4c4a31957e37- immutable image ID
sha256:466e07e7ea13241d68674fadda868d14d923336eb2f4fa0022be0d866230d8b4- platform
- linux/arm64
- network
- phaseA:bridge,phaseB:none
Declared checks
Execution summary
7/7 declared commands returned exit 0 in the recorded environment
PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui exec vitest run src/composables/charts/shared/chartConfig.test.tsexit 0 · 5s
PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui typecheckexit 0 · 19.5s
PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui format:checkexit 0 · 9.2s
PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui testexit 0 · 8s
EMBED_UI=True PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui buildexit 0 · 15.3s
PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH GOMODCACHE=/workspace/.northset/bootstrap-home/project-go-mod go test -count=1 ./...exit 0 · 29s
PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH GOMODCACHE=/workspace/.northset/bootstrap-home/project-go-mod golangci-lint runexit 0 · 14.7s
run wall (derived from recorded timestamps) 5m42s
PASS — 7/7 declared commands
Every command listed returned exit 0 in the declared environment. Only the listed commands are in scope. Unlisted test, lint, typecheck, build, coverage, compiler, full-suite, and CI gates are not implied or recorded.
Public scope interpretation
The focused regression verifies the shared renderDonutSvg output but does not manually exercise every chart caller in a browser.
Committed patch.diff
diff --git a/ui/src/composables/charts/shared/chartConfig.test.ts b/ui/src/composables/charts/shared/chartConfig.test.ts
index 9c8bc6b351beca587a1a9553d95a0f03e15ddd54..71e417dc2dc291a1307318ef1278140fcaebc6ed 100644
--- a/ui/src/composables/charts/shared/chartConfig.test.ts
+++ b/ui/src/composables/charts/shared/chartConfig.test.ts
@@ -4,6 +4,7 @@ import {
createValueAxisConfig,
createDataZoomConfig,
createGridConfig,
+ createTooltipConfig,
createValueModeGridConfig,
VALUE_MODE_GRID_TOP,
createHeatmapLayoutConfig,
@@ -18,6 +19,7 @@ import {
HEATMAP_Y_ZOOM_INSET,
formatRadarItemTooltip,
hasRotatedXLabels,
+ renderDonutSvg,
renderTooltipLegendColumns,
TOOLTIP_LEGEND_MAX_ROWS_PER_COL,
getTooltipTheme,
@@ -193,6 +195,71 @@ describe('renderTooltipLegendColumns', () => {
})
})
+describe('renderDonutSvg', () => {
+ it('includes zero-valued slices in the legend without drawing their arcs', () => {
+ const html = renderDonutSvg([
+ { name: 'A', value: 10, color: '#a00' },
+ { name: 'B', value: 0, color: '#0b0' },
+ { name: 'C', value: 5, color: '#00c' },
+ ])
+
+ expect(html).toContain('<span>A</span><b style="margin-left:6px">66.7%</b>')
+ expect(html).toContain('<span>B</span><b style="margin-left:6px">n/a</b>')
+ expect(html).toContain('<span>C</span><b style="margin-left:6px">33.3%</b>')
+ expect(html.match(/<path /g) ?? []).toHaveLength(2)
+ expect(html).toMatch(/<path [^>]*fill="#a00"\/>/)
+ expect(html).not.toMatch(/<path [^>]*fill="#0b0"\/>/)
+ expect(html).toMatch(/<path [^>]*fill="#00c"\/>/)
+ })
+
+ it('returns empty when fewer than two positive slices are present', () => {
+ expect(
+ renderDonutSvg([
+ { name: 'A', value: 10, color: '#a00' },
+ { name: 'B', value: 0, color: '#0b0' },
+ ])
+ ).toBe('')
+ })
+})
+
+describe('createTooltipConfig', () => {
+ it('keeps missing and nonnumeric values out of the donut while showing numeric zero as n/a', () => {
+ const tooltip = createTooltipConfig(true, false) as any
+ const html = tooltip.formatter([
+ { name: 'X', seriesName: 'A', value: 10, color: '#a00', marker: 'A-marker' },
+ { name: 'X', seriesName: 'Zero', value: 0, color: '#0b0', marker: 'Zero-marker' },
+ { name: 'X', seriesName: 'Null', value: null, color: '#ccc', marker: 'Null-marker' },
+ {
+ name: 'X',
+ seriesName: 'Undefined',
+ value: undefined,
+ color: '#ddd',
+ marker: 'Undefined-marker',
+ },
+ {
+ name: 'X',
+ seriesName: 'Text',
+ value: 'not-a-number',
+ color: '#eee',
+ marker: 'Text-marker',
+ },
+ { name: 'X', seriesName: 'C', value: 5, color: '#00c', marker: 'C-marker' },
+ ])
+
+ expect(html).toContain('Zero-marker Zero: 0')
+ expect(html).toContain('Text-marker Text: not-a-number')
+ expect(html).not.toContain('Null-marker')
+ expect(html).not.toContain('Undefined-marker')
+
+ const donut = html.slice(html.indexOf('<svg'))
+ expect(donut).toContain('<span>Zero</span><b style="margin-left:6px">n/a</b>')
+ expect(donut.match(/>n\/a<\/b>/g) ?? []).toHaveLength(1)
+ expect(donut).not.toContain('<span>Null</span>')
+ expect(donut).not.toContain('<span>Undefined</span>')
+ expect(donut).not.toContain('<span>Text</span>')
+ })
+})
+
describe('formatRadarItemTooltip', () => {
it('returns empty string when params.data is missing', () => {
expect(formatRadarItemTooltip({}, indicators, false)).toBe('')
@@ -243,4 +310,18 @@ describe('formatRadarItemTooltip', () => {
expect(html).toContain('display:grid')
expect(html).toContain('grid-auto-flow:column')
})
+
+ it('omits an indicator without a corresponding numeric value from the donut', () => {
+ const html = formatRadarItemTooltip(
+ { data: { name: 'Series', value: [10, 5] } },
+ indicators,
+ false
+ )
+ const donut = html.slice(html.indexOf('<svg'))
+
+ expect(donut).toContain('<span>A</span>')
+ expect(donut).toContain('<span>B</span>')
+ expect(donut).not.toContain('<span>C</span>')
+ expect(donut).not.toContain('n/a')
+ })
})
diff --git a/ui/src/composables/charts/shared/chartConfig.ts b/ui/src/composables/charts/shared/chartConfig.ts
index 9e5995b43874494fd3b5cf7d1a7c7dadade5ce85..aa1e5127b3377ec5c9ff984f1c322163fc86aa4e 100644
--- a/ui/src/composables/charts/shared/chartConfig.ts
+++ b/ui/src/composables/charts/shared/chartConfig.ts
@@ -534,11 +534,10 @@ export function formatRadarItemTooltip(
const spread = tooltipSpreadRows(vals, isDark)
const donut = renderDonutSvg(
- indicatorNames.map((name, i) => ({
- name,
- value: typeof vals[i] === 'number' ? vals[i]! : 0,
- color: color(name),
- }))
+ indicatorNames.flatMap((name, i) => {
+ const value = vals[i]
+ return typeof value === 'number' ? [{ name, value, color: color(name) }] : []
+ })
)
const donutBlock = donut ? `${tooltipDivider(isDark)}${donut}` : ''
@@ -582,9 +581,9 @@ export function tooltipSpreadRows(values: number[], isDark: boolean): string {
)
}
-// Inline SVG donut + side legend (swatch, name, %) for tooltips. Non-positive
-// slices are dropped (can't show negative share). Returns '' when fewer than 2
-// positive slices — nothing to compare.
+// Inline SVG donut + side legend (swatch, name, %) for tooltips. Only positive
+// slices draw arcs; zero slices remain in the legend as n/a. Returns '' when
+// fewer than 2 positive slices are present — nothing to compare.
export function renderDonutSvg(
slices: { value: number; color: string; name: string }[],
size = 96
@@ -634,11 +633,13 @@ export function renderDonutSvg(
// Side legend: one row per slice (swatch + name + share %). Scrolls with the
// tooltip when there are many slices.
- const legendRows = pos.map((s) => {
- const pct = ((s.value / total) * 100).toFixed(1)
- const swatch = `<span style="display:inline-block;width:10px;height:10px;border-radius:2px;background:${s.color};margin-right:6px;flex:none"></span>`
- return `${swatch}<span>${s.name}</span><b style="margin-left:6px">${pct}%</b>`
- })
+ const legendRows = slices
+ .filter((s) => s.value >= 0)
+ .map((s) => {
+ const share = s.value === 0 ? 'n/a' : `${((s.value / total) * 100).toFixed(1)}%`
+ const swatch = `<span style="display:inline-block;width:10px;height:10px;border-radius:2px;background:${s.color};margin-right:6px;flex:none"></span>`
+ return `${swatch}<span>${s.name}</span><b style="margin-left:6px">${share}</b>`
+ })
const legend = renderTooltipLegendColumns(
legendRows,
TOOLTIP_LEGEND_MAX_ROWS_PER_COL,
@@ -719,11 +720,16 @@ export function createTooltipConfig(
isDark
)
const donut = renderDonutSvg(
- params.map((p) => ({
- value: typeof p.value === 'number' ? p.value : 0,
- color: typeof p.color === 'string' ? p.color : String(p.color),
- name: p.seriesName ?? '',
- }))
+ params.flatMap((p) => {
+ if (typeof p.value !== 'number') return []
+ return [
+ {
+ value: p.value,
+ color: typeof p.color === 'string' ? p.color : String(p.color),
+ name: p.seriesName ?? '',
+ },
+ ]
+ })
)
return `${body}${sumLine}${spread}${donut ? tooltipDivider(isDark) + donut : ''}`
},
Redacted stdout
=== cmd 1: PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui exec vitest run src/composables/charts/shared/chartConfig.test.ts ===
[1m[30m[46m RUN [49m[39m[22m [36mv4.1.9 [39m[90m/workspace/ui[39m
[32m✓[39m src/composables/charts/shared/chartConfig.test.ts [2m([22m[2m30 tests[22m[2m)[22m[32m 13[2mms[22m[39m
[2m Test Files [22m [1m[32m1 passed[39m[22m[90m (1)[39m
[2m Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
[2m Start at [22m 12:00:18
[2m Duration [22m 2.00s[2m (transform 1.35s, setup 0ms, import 1.62s, tests 13ms, environment 0ms)[22m
=== cmd 2: PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui typecheck ===
> ui@0.0.0 typecheck /workspace/ui
> vue-tsc -b --noEmit
=== cmd 3: PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui format:check ===
> ui@0.0.0 format:check /workspace/ui
> prettier --check .
Checking formatting...
All matched files use Prettier code style!
=== cmd 4: PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui test ===
> ui@0.0.0 test /workspace/ui
> vitest run
[1m[30m[46m RUN [49m[39m[22m [36mv4.1.9 [39m[90m/workspace/ui[39m
[32m✓[39m src/lib/stats.test.ts [2m([22m[2m79 tests[22m[2m)[22m[32m 51[2mms[22m[39m
[32m✓[39m src/composables/settings/fieldRegistry.test.ts [2m([22m[2m28 tests[22m[2m)[22m[32m 14[2mms[22m[39m
[32m✓[39m src/lib/transform.test.ts [2m([22m[2m57 tests[22m[2m)[22m[32m 24[2mms[22m[39m
[32m✓[39m src/composables/charts/shared/chartConfig.test.ts [2m([22m[2m30 tests[22m[2m)[22m[32m 11[2mms[22m[39m
[32m✓[39m src/composables/charts/shared/3d.test.ts [2m([22m[2m41 tests[22m[2m)[22m[32m 12[2mms[22m[39m
[32m✓[39m src/lib/utils.test.ts [2m([22m[2m38 tests[22m[2m)[22m[32m 8[2mms[22m[39m
[32m✓[39m src/workers/transform.worker.test.ts [2m([22m[2m20 tests[22m[2m)[22m[32m 262[2mms[22m[39m
[32m✓[39m src/components/SettingsPanel.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 5[2mms[22m[39m
[32m✓[39m src/composables/useChartPipeline.test.ts [2m([22m[2m14 tests[22m[2m)[22m[32m 31[2mms[22m[39m
[32m✓[39m src/composables/charts/useScatterChartOptions.test.ts [2m([22m[2m22 tests[22m[2m)[22m[32m 16[2mms[22m[39m
[32m✓[39m src/composables/useStatsWorker.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
[32m✓[39m src/composables/charts/useBarChartOptions.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 15[2mms[22m[39m
[32m✓[39m src/composables/useUrlRouter.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 73[2mms[22m[39m
[32m✓[39m src/composables/useSettingsStore.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 51[2mms[22m[39m
[32m✓[39m src/composables/charts/useLineChartOptions.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 18[2mms[22m[39m
[32m✓[39m src/composables/charts/useScatter3DChartOptions.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 13[2mms[22m[39m
[32m✓[39m src/workers/stats.worker.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 29[2mms[22m[39m
[32m✓[39m src/composables/useActiveChartShape.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 66[2mms[22m[39m
[32m✓[39m src/lib/descriptiveColumns.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 5[2mms[22m[39m
[32m✓[39m src/composables/charts/useGrouped3DZAxisLabel.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 9[2mms[22m[39m
[32m✓[39m src/lib/swap.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 6[2mms[22m[39m
[32m✓[39m src/lib/csv.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 5[2mms[22m[39m
[32m✓[39m src/composables/charts/baseChartOptions.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 4[2mms[22m[39m
[32m✓[39m embed-build/go-codegen.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 22[2mms[22m[39m
[32m✓[39m src/lib/themes.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 10[2mms[22m[39m
[32m✓[39m src/composables/useDataPoint.normalize.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 3[2mms[22m[39m
[32m✓[39m src/composables/charts/shared/visualMap.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 3[2mms[22m[39m
[32m✓[39m src/composables/charts/useCorrelationOption.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 10[2mms[22m[39m
[32m✓[39m src/lib/filterDataSetSettings.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 3[2mms[22m[39m
[32m✓[39m src/lib/pickerRule.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 2[2mms[22m[39m
[2m Test Files [22m [1m[32m30 passed[39m[22m[90m (30)[39m
[2m Tests [22m [1m[32m462 passed[39m[22m[90m (462)[39m
[2m Start at [22m 12:00:59
[2m Duration [22m 6.17s[2m (transform 2.68s, setup 0ms, import 8.91s, tests 786ms, environment 2ms)[22m
=== cmd 5: EMBED_UI=True PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui build ===
> ui@0.0.0 build /workspace/ui
> vue-tsc -b && vite build
[info] EMBED_UI env var: True
[log] [36mvite v8.1.0 [32mbuilding client environment for production...[36m[39m
[2K
transforming...✓ 795 modules transformed.
rendering chunks...
computing gzip size...
[log] dist/index.html 2.34 kB │ gzip: 0.89 kB
dist/assets/style-CBsyy9YK.css 18.98 kB │ gzip: 4.52 kB
dist/assets/CoordinateSystem-CQYdir-d.js 0.04 kB │ gzip: 0.06 kB
dist/assets/sectorHelper-DH3hWBQK.js 0.26 kB │ gzip: 0.21 kB
dist/assets/labelHelper-B3dLspwy.js 0.45 kB │ gzip: 0.29 kB
dist/assets/ChartScatter-BuAtWAHX.js 0.66 kB │ gzip: 0.39 kB
dist/assets/LegendVisualProvider-nnn8ZDeM.js 0.96 kB │ gzip: 0.49 kB
dist/assets/dataSample-Ds2J_ejG.js 1.98 kB │ gzip: 0.96 kB
dist/assets/labelGuideHelper-CIDrUKMP.js 5.38 kB │ gzip: 2.41 kB
dist/assets/install-BUAhqOuF.js 6.29 kB │ gzip: 2.37 kB
dist/assets/ChartHeatmap-CK4EAREd.js 6.90 kB │ gzip: 2.92 kB
dist/assets/points-DHZDpxxX.js 7.06 kB │ gzip: 2.82 kB
dist/assets/axisAlignTicks-CIyXe2Zs.js 8.38 kB │ gzip: 3.25 kB
dist/assets/ChartRadar-BLNtE45G.js 11.86 kB │ gzip: 4.61 kB
dist/assets/ChartPie-BPbpp0FQ.js 13.10 kB │ gzip: 5.55 kB
dist/assets/ChartBar-nJSlSRgV.js 17.43 kB │ gzip: 6.51 kB
dist/assets/install-CeV-OgWo.js 17.50 kB │ gzip: 6.09 kB
dist/assets/ChartLine-DFGW10Eq.js 20.33 kB │ gzip: 8.26 kB
dist/assets/base-IPePAI0l.js 21.82 kB │ gzip: 7.65 kB
dist/assets/install-BajAoG8-.js 35.63 kB │ gzip: 11.60 kB
dist/assets/index-QdWSoSdn.js 372.32 kB │ gzip: 119.38 kB
dist/assets/Chart3D-DzAh8MrT.js 464.88 kB │ gzip: 129.03 kB
dist/assets/dist-DX1-RU5m.js 490.63 kB │ gzip: 164.76 kB
[log] [32m✓ built in 3.15s[39m
[info] [embed-ui] 21 chunks
dist/assets/dist-DX1-RU5m.js 479.13 kB │ encoded: 212.32 kB
dist/assets/Chart3D-DzAh8MrT.js 453.99 kB │ encoded: 166.63 kB
dist/assets/index-QdWSoSdn.js 363.59 kB │ encoded: 153.69 kB
dist/assets/install-BajAoG8-.js 34.80 kB │ encoded: 14.95 kB
dist/assets/base-IPePAI0l.js 21.32 kB │ encoded: 9.89 kB
dist/assets/ChartLine-DFGW10Eq.js 19.86 kB │ encoded: 10.70 kB
dist/assets/install-CeV-OgWo.js 17.09 kB │ encoded: 7.89 kB
dist/assets/ChartBar-nJSlSRgV.js 17.03 kB │ encoded: 8.45 kB
dist/assets/ChartPie-BPbpp0FQ.js 12.80 kB │ encoded: 7.21 kB
dist/assets/ChartRadar-BLNtE45G.js 11.59 kB │ encoded: 5.97 kB
dist/assets/axisAlignTicks-CIyXe2Zs.js 8.19 kB │ encoded: 4.21 kB
dist/assets/points-DHZDpxxX.js 6.90 kB │ encoded: 3.66 kB
dist/assets/ChartHeatmap-CK4EAREd.js 6.74 kB │ encoded: 3.80 kB
dist/assets/install-BUAhqOuF.js 6.15 kB │ encoded: 3.09 kB
dist/assets/labelGuideHelper-CIDrUKMP.js 5.26 kB │ encoded: 3.14 kB
dist/assets/dataSample-Ds2J_ejG.js 1.94 kB │ encoded: 1.26 kB
dist/assets/LegendVisualProvider-nnn8ZDeM.js 0.94 kB │ encoded: 0.64 kB
dist/assets/ChartScatter-BuAtWAHX.js 0.65 kB │ encoded: 0.52 kB
dist/assets/labelHelper-B3dLspwy.js 0.44 kB │ encoded: 0.39 kB
dist/assets/sectorHelper-DH3hWBQK.js 0.26 kB │ encoded: 0.28 kB
dist/assets/CoordinateSystem-CQYdir-d.js 0.05 kB │ encoded: 0.09 kB
HTML template (placeholder): 21.33 kB
=== cmd 6: PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH GOMODCACHE=/workspace/.northset/bootstrap-home/project-go-mod go test -count=1 ./... ===
? github.com/goptics/vizb [no test files]
ok github.com/goptics/vizb/cmd 0.169s
? github.com/goptics/vizb/cmd/charts/bar [no test files]
? github.com/goptics/vizb/cmd/charts/heatmap [no test files]
? github.com/goptics/vizb/cmd/charts/line [no test files]
? github.com/goptics/vizb/cmd/charts/pie [no test files]
? github.com/goptics/vizb/cmd/charts/radar [no test files]
? github.com/goptics/vizb/cmd/charts/scatter [no test files]
ok github.com/goptics/vizb/cmd/cli 0.190s
ok github.com/goptics/vizb/internal/charts 0.036s
? github.com/goptics/vizb/internal/charts/bar [no test files]
? github.com/goptics/vizb/internal/charts/heatmap [no test files]
? github.com/goptics/vizb/internal/charts/line [no test files]
? github.com/goptics/vizb/internal/charts/pie [no test files]
? github.com/goptics/vizb/internal/charts/radar [no test files]
? github.com/goptics/vizb/internal/charts/scatter [no test files]
ok github.com/goptics/vizb/internal/flags 0.027s
ok github.com/goptics/vizb/pkg/parser 0.023s
ok github.com/goptics/vizb/pkg/parser/csv 0.040s
ok github.com/goptics/vizb/pkg/parser/golang 0.021s
ok github.com/goptics/vizb/pkg/parser/javascript 0.017s
ok github.com/goptics/vizb/pkg/parser/json 0.067s
ok github.com/goptics/vizb/pkg/parser/rust 0.025s
? github.com/goptics/vizb/pkg/style [no test files]
ok github.com/goptics/vizb/pkg/template 0.069s
ok github.com/goptics/vizb/shared 0.029s
ok github.com/goptics/vizb/shared/utils 0.021s
ok github.com/goptics/vizb/testutil 0.008s
? github.com/goptics/vizb/version [no test files]
=== cmd 7: PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH GOMODCACHE=/workspace/.northset/bootstrap-home/project-go-mod golangci-lint run ===
0 issues.
Redacted stderr
=== cmd 1: PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui exec vitest run src/composables/charts/shared/chartConfig.test.ts ===
=== cmd 2: PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui typecheck ===
=== cmd 3: PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui format:check ===
=== cmd 4: PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui test ===
=== cmd 5: EMBED_UI=True PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui build ===
[warn] Browserslist: browsers data (caniuse-lite) is 9 months old. Please run:
npx update-browserslist-db@latest
Why you should do it regularly: https://github.com/browserslist/update-db#readme
[warn] [33m[33m[PLUGIN_TIMINGS] [0mYour build spent significant time in plugins. Here is a breakdown:
- vite:vue (78%)
- vite:worker (6%)
- vite:css (5%)
- rolldown:vite-resolve (5%)
See https://rolldown.rs/reference/InputOptions.checks#plugintimings for more details.
[39m
=== cmd 6: PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH GOMODCACHE=/workspace/.northset/bootstrap-home/project-go-mod go test -count=1 ./... ===
=== cmd 7: PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH GOMODCACHE=/workspace/.northset/bootstrap-home/project-go-mod golangci-lint run ===
03Provenance & limitations
Bundle identity, attestation, verification, and claims boundary
Provenance & limitations
Bundle identity, attestation, verification, and claims boundaryRecord details
- payment
- none · not merge-contingent
- redactions
- none recorded
- Bundle contents digest
sha256:5a774731726a0464e901d7c64203effe29c2893b9b6e359198e8e944845b0584- Signed asset SHA-256
sha256:63670e6654fe2f1f372d310636afaae274142d35f5047a9a6e40ea27fa08ed22- Signed provenance recorded
- verified 2026-07-15T12:36:28.203Z
NOT INCLUDED
- Does not prove code quality
- Does not prove security
- The focused regression verifies the shared renderDonutSvg output but does not manually exercise every chart caller in a browser.
- Contributor self-run record of Northset's own contribution; not the maintainer's verification.
Signed bundle
Verify this receipt
gh attestation verify run-record-M-031-5a774731726a.tar.gz --repo northset-oss/verification-pilot --signer-workflow northset-oss/verification-pilot/.github/workflows/attest-bundle.ymlAttestation confirms that Northset's signing workflow produced this exact bundle. The signer does not witness the recorded run, and verification does not turn it into maintainer verification.
QR → receipt page