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

7/7

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.

  1. ATTEMPTS 1–6M-022 → M-0276× FAILED ORACLEverification
  2. ATTEMPT 7M-028FAILED AUTHORauthoring
  3. ATTEMPT 8M-029STALEprecondition drift
  4. ATTEMPT 9M-030FAILED AUTHORauthoring
  5. ATTEMPT 10M-031READY

ATTEMPT 10 / EXECUTION ANATOMY

01Discovery18m07s60.4%
02Qualification2m03s6.9%
03Authoring4m07s13.7%
04Verification5m42s19%

03 / ECONOMIC NARRATIVE

Economic identity

Observed sponsorship, authorization, scope, transfer, and outcome. No estimates or inferred value.

  1. 01 / MANDATE

    Sponsored and authorized

    The recorded mandate names both its sponsor and initiative, with authorization tied to a named approver and approval time.

    SPONSORNorthset OSS Fund · OSS mission experimentation

    AUTHORIZEDinternal-user:aeziz ·

  2. 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.

    TASKTASK-OSS-974F612F87373753 · defect fix · attempt 10

    INVITATIONIssue #204 · label

    SCOPE2 files · 123 changed lines · 1 production files · 1 test files · 7 declared checks

  3. 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.

    MAINTAINER TRANSFERnone · not merge contingent

    UPSTREAMMERGED · 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
TOTAL COSTUNPRICED

No complete total is recorded; see the missing or unpriced component record above.

Evidence annexEconomic · technical · provenance · limitations
01

Economic evidence

Lineage, usage, caps, outcome, and cost provenance

Attempt lineage

  • M-022attempt 1 · FAILED ORACLE · verification
  • M-023attempt 2 · FAILED ORACLE · verification
  • M-024attempt 3 · FAILED ORACLE · verification
  • M-025attempt 4 · FAILED ORACLE · verification
  • M-026attempt 5 · FAILED ORACLE · verification
  • M-027attempt 6 · FAILED ORACLE · verification
  • M-028attempt 7 · FAILED AUTHOR · authoring
  • M-029attempt 8 · STALE · precondition drift
  • M-030attempt 9 · FAILED AUTHOR · authoring
  • M-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
02

Technical evidence

Code, environment, exact commands, patch, and outputs

Project

goptics/vizb

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

  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

    exit 0 · 5s

  2. PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui typecheck

    exit 0 · 19.5s

  3. PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui format:check

    exit 0 · 9.2s

  4. PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui test

    exit 0 · 8s

  5. EMBED_UI=True PATH=/workspace/.northset/bootstrap-home/bin:/workspace/.northset/bootstrap-home/go/bin:$PATH pnpm --dir ui build

    exit 0 · 15.3s

  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 ./...

    exit 0 · 29s

  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

    exit 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 ===

 RUN  v4.1.9 /workspace/ui

 ✓ src/composables/charts/shared/chartConfig.test.ts (30 tests) 13ms

 Test Files  1 passed (1)
      Tests  30 passed (30)
   Start at  12:00:18
   Duration  2.00s (transform 1.35s, setup 0ms, import 1.62s, tests 13ms, environment 0ms)

=== 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


 RUN  v4.1.9 /workspace/ui

 ✓ src/lib/stats.test.ts (79 tests) 51ms
 ✓ src/composables/settings/fieldRegistry.test.ts (28 tests) 14ms
 ✓ src/lib/transform.test.ts (57 tests) 24ms
 ✓ src/composables/charts/shared/chartConfig.test.ts (30 tests) 11ms
 ✓ src/composables/charts/shared/3d.test.ts (41 tests) 12ms
 ✓ src/lib/utils.test.ts (38 tests) 8ms
 ✓ src/workers/transform.worker.test.ts (20 tests) 262ms
 ✓ src/components/SettingsPanel.test.ts (11 tests) 5ms
 ✓ src/composables/useChartPipeline.test.ts (14 tests) 31ms
 ✓ src/composables/charts/useScatterChartOptions.test.ts (22 tests) 16ms
 ✓ src/composables/useStatsWorker.test.ts (7 tests) 5ms
 ✓ src/composables/charts/useBarChartOptions.test.ts (9 tests) 15ms
 ✓ src/composables/useUrlRouter.test.ts (8 tests) 73ms
 ✓ src/composables/useSettingsStore.test.ts (7 tests) 51ms
 ✓ src/composables/charts/useLineChartOptions.test.ts (9 tests) 18ms
 ✓ src/composables/charts/useScatter3DChartOptions.test.ts (5 tests) 13ms
 ✓ src/workers/stats.worker.test.ts (4 tests) 29ms
 ✓ src/composables/useActiveChartShape.test.ts (9 tests) 66ms
 ✓ src/lib/descriptiveColumns.test.ts (10 tests) 5ms
 ✓ src/composables/charts/useGrouped3DZAxisLabel.test.ts (6 tests) 9ms
 ✓ src/lib/swap.test.ts (8 tests) 6ms
 ✓ src/lib/csv.test.ts (12 tests) 5ms
 ✓ src/composables/charts/baseChartOptions.test.ts (2 tests) 4ms
 ✓ embed-build/go-codegen.test.ts (7 tests) 22ms
 ✓ src/lib/themes.test.ts (5 tests) 10ms
 ✓ src/composables/useDataPoint.normalize.test.ts (2 tests) 3ms
 ✓ src/composables/charts/shared/visualMap.test.ts (3 tests) 3ms
 ✓ src/composables/charts/useCorrelationOption.test.ts (3 tests) 10ms
 ✓ src/lib/filterDataSetSettings.test.ts (3 tests) 3ms
 ✓ src/lib/pickerRule.test.ts (3 tests) 2ms

 Test Files  30 passed (30)
      Tests  462 passed (462)
   Start at  12:00:59
   Duration  6.17s (transform 2.68s, setup 0ms, import 8.91s, tests 786ms, environment 2ms)

=== 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] vite v8.1.0 building client environment for production...

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] ✓ built in 3.15s
[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] [PLUGIN_TIMINGS] Your 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.

=== 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 ===
03

Provenance & limitations

Bundle identity, attestation, verification, and claims boundary

Record 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

Download 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.yml

Attestation 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
Northset contributed this fix and ran its declared checks. Contributor self-run. Not maintainer verification.

Evidence of what ran — not a verdict that the code is good.

SELF-FUNDED FIELD-TESTING.

FOR MAINTAINERS

Request a private run

Maintain an open-source project? Send Northset a PR already in your queue. We run its repository-declared checks in an isolated container and return the run record privately. We do not modify the PR. Nothing is published without your approval. Free during the pilot.

The issue form is public. Do not include secrets or private repository details there; use email instead.

Already onboarded? Add northset-verify to a PR to request a run on that PR.

Claims boundary

This page reports scoped proof-of-pass receipt evidence. It does not prove code quality, security, full CI coverage, production readiness, or maintainer approval. An attestation confirms bundle provenance; it does not broaden the receipt's claim.

Read the full Claims Boundary policy.