Skip to content

Design pass: measure and range & bearing tools (#1130) - #1190

Merged
philliphoff merged 1 commit into
mainfrom
claude/measure-range-bearing-design
Oct 31, 2026
Merged

philliphoff merged 1 commit into
mainfrom
claude/measure-range-bearing-design

Conversation

@philliphoff

Copy link
Copy Markdown
Owner

Design pass for the viewer tools the S-164 Part 4 accuracy tests (Accuracy1–15) use. Refs #1130. Docs only; nothing is built yet.

Adds docs/design/measure-range-bearing.md:

  • what the tests ask (paraphrased; the manual isn't quoted or committed), with Accuracy1 worked on today's sphere: 33,154 m, 295.7° / 115.9°;
  • an audit of today's measure tool (A1–A12): rhumb only, forward bearing only, 0.1 NM / whole-degree precision, NM only, no typed positions, no range & bearing tool or geodesic circles, 24-segment great-circle route legs, two earth radii, no MCP;
  • decisions D1–D23: a measure card with Rhumb | Great circle (G), reverse bearing, 0.01 NM / 1 m / 0.1° precision, units from the existing Distance unit setting with the other system underneath, typed positions through LatLonFormatter.TryParse; a new Range & bearing tool (Cmd/Ctrl+R) with range and bearing locks, geodesic VRM and range rings; length-based densification; keys, automation IDs, light and dark, and set_measure / get_measure / set_range_bearing / get_range_bearing MCP tools;
  • out of scope (WGS-84 is WGS-84 ellipsoidal geodesy: choose a source and licensing, then move Core, Navigation and the viewer onto it #1189; own-ship EBL/VRM goes with Route monitoring: look-ahead alerts from own ship #1131) and four slices.

The mock is the Measure & range/bearing · design pass artboard on the Navigation & time page of the design canvas: https://claude.ai/artifact/2hWbgQ9wKM1gC2gM51mSCs

Open questions (§6): great circle as the first-run default (proposed: no, remember the last choice), Cmd/Ctrl+R for the new tool, and whether the second unit line always shows.

@github-actions

Copy link
Copy Markdown
Contributor

Performance Gate

✅ PASSED — no regressions.

Threshold: 10.0%, MAD multiplier (k): 3.0, retry-zone mult: 2.0×

Scenario summary

Scenario Status Δ median (%) z (Δ/MAD) Base median (ms) Samples (b/c)
exchange-set-open ✅ pass -0.7 -0.07 0.74 20/20
s101-pick-warm ✅ pass -0.1 -0.08 1.62 5/5
s101-portray-cold ✅ pass +2.7 +0.47 259.38 20/20
s101-portray-warm ✅ pass +2.1 +0.61 4.56 20/20
s101-real-cold ✅ pass -3.2 -1.98 1.72 5/5
s101-real-warm ✅ pass -1.6 -0.53 1.68 5/5
s101-render-repeat ✅ pass -0.5 -0.16 53.90 20/20
s101-render-warm ✅ pass +1.5 +0.85 5.25 20/20
s102-coverage ✅ pass +3.1 +1.44 1.57 20/20
s102-coverage-open ✅ pass +5.9 +3.16 2.40 20/20
s102-coverage-render-large ✅ pass -0.8 -0.50 154.16 20/20
s102-coverage-render-repeat ✅ pass +0.7 +1.00 955.97 20/20
s102-coverage-viewport-fit ✅ pass -3.2 -0.81 94.11 20/20
s102-coverage-viewport-zoomed-in ✅ pass +12.6 +3.21 1.63 20/20
s102-coverage-viewport-zoomed-out ✅ pass -1.1 -0.26 6.50 20/20
s102-real-warm ✅ pass -6.7 -0.66 0.39 5/5
s111-arrow-repeat ✅ pass -2.9 -0.28 4.47 20/20
s111-real-warm ✅ pass +13.9 +1.40 0.27 5/5
s124-vector ✅ pass -4.9 -1.17 0.28 20/20
s201-vector ✅ pass -0.4 -0.04 0.34 20/20

exchange-set-open

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 0.74 0.73
Baseline MAD (ms) 0.07 —
Δ median — -0.7%
z (Δ/MAD) — -0.07

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.asset.read 60.99 61.45 +0.8% ▫️
s100.exchangeset.parse 60.28 60.15 -0.2% ▫️

Metrics

Metric Baseline Candidate Delta Status
s100.asset.read.duration 0.28 0.32 +11.1% ❌

s101-pick-warm

Iteration statistics

Stat Baseline Candidate
Samples 5 5
Median (ms) 1.62 1.62
Baseline MAD (ms) 0.02 —
Δ median — -0.1%
z (Δ/MAD) — -0.08

s101-portray-cold

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 259.38 266.27
Baseline MAD (ms) 14.67 —
Δ median — +2.7%
z (Δ/MAD) — +0.47

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.featurecatalogue.parse 216.99 217.17 +0.1% ▫️
s100.lua.execute 7748.44 7840.59 +1.2% ▫️
s100.lua.rule.invoke 6138.92 6218.17 +1.3% ▫️
s100.pipeline.vector.execute_rules 7828.35 7920.46 +1.2% ▫️
s100.pipeline.vector.stage.lua 7758.25 7850.68 +1.2% ▫️
s100.pipeline.vector.stage.rule_select 36.67 35.93 -2.0% ▫️
s100.pipeline.vector.stage.sort 18.05 18.46 +2.3% ▫️
s100.pipeline.vector.stage.viewing_groups 7.63 7.80 +2.2% ▫️
s100.render.frame 5748.28 5763.43 +0.3% ▫️

Metrics

Metric Baseline Candidate Delta Status
s100.catalogue.match.count 7.00 7.00 +0.0% ▫️
s100.featurecatalogue.cache.hit.count 6.00 6.00 +0.0% ▫️
s100.featurecatalogue.cache.miss.count 1.00 1.00 +0.0% ▫️
s100.lua.execute.duration 1698.62 1611.94 -5.1% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 126.00 126.00 +0.0% ▫️
s100.lua.feature.instructions.count 560.00 560.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.feature.instructions.count 56.00 56.00 +0.0% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 210.00 210.00 +0.0% ▫️
s100.lua.feature.instructions.count 70.00 70.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.features.count 1085.00 1085.00 +0.0% ▫️
s100.lua.instructions.emitted.count 2296.00 2296.00 +0.0% ▫️
s100.lua.rule.invoke.count 7.00 7.00 +0.0% ▫️
s100.lua.rule.invoke.count 77.00 77.00 +0.0% ▫️
s100.lua.rule.invoke.duration 1358.29 1279.33 -5.8% ▫️
s100.lua.rule.invoke.duration 7.33 6.89 -6.0% ▫️
s100.lua.source.cache.hit.count 1290.00 1290.00 +0.0% ▫️
s100.lua.source.cache.miss.count 215.00 215.00 +0.0% ▫️
s100.pattern.cache.hit.count 231.00 231.00 +0.0% ▫️
s100.pattern.cache.miss.count 28.00 28.00 +0.0% ▫️
s100.pipeline.features.in 77.00 77.00 +0.0% ▫️
s100.pipeline.stage.duration 1700.38 1614.01 -5.1% ▫️
s100.pipeline.stage.duration 7.23 6.55 -9.4% ▫️
s100.pipeline.stage.duration 3.59 3.25 -9.4% ▫️
s100.pipeline.stage.duration 1.45 1.48 +2.1% ▫️
s100.pipeline.stage.instructions.count 2296.00 2296.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 2296.00 2296.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 2296.00 2296.00 +0.0% ▫️
s100.portrayal.cache.hit.count 24.00 24.00 +0.0% ▫️
s100.portrayal.cache.hit.count 1290.00 1290.00 +0.0% ▫️
s100.portrayal.cache.hit.count 7.00 7.00 +0.0% ▫️
s100.portrayal.cache.hit.count 204.00 204.00 +0.0% ▫️
s100.portrayal.cache.miss.count 4.00 4.00 +0.0% ▫️
s100.portrayal.cache.miss.count 215.00 215.00 +0.0% ▫️
s100.portrayal.cache.miss.count 34.00 34.00 +0.0% ▫️
s100.render.frame.duration 1183.95 1110.69 -6.2% ▫️
s100.render.instructions.processed.count 2296.00 2296.00 +0.0% ▫️
s100.render.styles.applied.count 2429.00 2429.00 +0.0% ▫️
s100.symbol.cache.hit.count 280.00 280.00 +0.0% ▫️
s100.symbol.cache.miss.count 210.00 210.00 +0.0% ▫️
s100.symbol.resolve.duration 0.33 0.35 +5.9% ❌
s100.symbol.resolve.duration 31.10 34.36 +10.5% ❌

s101-portray-warm

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 4.56 4.65
Baseline MAD (ms) 0.16 —
Δ median — +2.1%
z (Δ/MAD) — +0.61

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.lua.execute 864.96 871.80 +0.8% ▫️
s100.lua.rule.invoke 713.18 722.99 +1.4% ▫️
s100.pipeline.vector.execute_rules 868.65 875.64 +0.8% ▫️
s100.pipeline.vector.stage.lua 865.25 872.10 +0.8% ▫️
s100.pipeline.vector.stage.rule_select 0.58 0.70 +20.9% ❌
s100.pipeline.vector.stage.sort 2.23 2.22 -0.5% ▫️
s100.pipeline.vector.stage.viewing_groups 2.49 2.49 -+0.0% ▫️
s100.render.frame 611.65 617.37 +0.9% ▫️

Metrics

Metric Baseline Candidate Delta Status
s100.catalogue.match.count 1.00 1.00 +0.0% ▫️
s100.featurecatalogue.cache.hit.count 7.00 7.00 +0.0% ▫️
s100.lua.execute.duration 166.54 172.49 +3.6% ▫️
s100.lua.feature.instructions.count 1.00 1.00 +0.0% ▫️
s100.lua.feature.instructions.count 18.00 18.00 +0.0% ▫️
s100.lua.feature.instructions.count 80.00 80.00 +0.0% ▫️
s100.lua.feature.instructions.count 2.00 2.00 +0.0% ▫️
s100.lua.feature.instructions.count 8.00 8.00 +0.0% ▫️
s100.lua.feature.instructions.count 1.00 1.00 +0.0% ▫️
s100.lua.feature.instructions.count 1.00 1.00 +0.0% ▫️
s100.lua.feature.instructions.count 30.00 30.00 +0.0% ▫️
s100.lua.feature.instructions.count 10.00 10.00 +0.0% ▫️
s100.lua.feature.instructions.count 2.00 2.00 +0.0% ▫️
s100.lua.feature.instructions.count 2.00 2.00 +0.0% ▫️
s100.lua.features.count 155.00 155.00 +0.0% ▫️
s100.lua.instructions.emitted.count 328.00 328.00 +0.0% ▫️
s100.lua.rule.invoke.count 1.00 1.00 +0.0% ▫️
s100.lua.rule.invoke.count 11.00 11.00 +0.0% ▫️
s100.lua.rule.invoke.duration 136.15 142.91 +5.0% ▫️
s100.lua.rule.invoke.duration 0.63 0.63 -0.5% ▫️
s100.lua.source.cache.hit.count 215.00 215.00 +0.0% ▫️
s100.pattern.cache.hit.count 255.00 255.00 +0.0% ▫️
s100.pattern.cache.miss.count 4.00 4.00 +0.0% ▫️
s100.pipeline.features.in 11.00 11.00 +0.0% ▫️
s100.pipeline.stage.duration 166.60 172.54 +3.6% ▫️
s100.pipeline.stage.duration 0.11 0.11 +3.0% ▫️
s100.pipeline.stage.duration 0.45 0.37 -18.7% ✅
s100.pipeline.stage.duration 0.49 0.38 -22.8% ✅
s100.pipeline.stage.instructions.count 328.00 328.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 328.00 328.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 2296.00 2296.00 +0.0% ▫️
s100.portrayal.cache.hit.count 28.00 28.00 +0.0% ▫️
s100.portrayal.cache.hit.count 215.00 215.00 +0.0% ▫️
s100.portrayal.cache.hit.count 7.00 7.00 +0.0% ▫️
s100.portrayal.cache.hit.count 238.00 238.00 +0.0% ▫️
s100.render.frame.duration 116.23 114.19 -1.8% ▫️
s100.render.instructions.processed.count 2296.00 2296.00 +0.0% ▫️
s100.render.styles.applied.count 2429.00 2429.00 +0.0% ▫️
s100.symbol.cache.hit.count 460.00 460.00 +0.0% ▫️
s100.symbol.cache.miss.count 30.00 30.00 +0.0% ▫️
s100.symbol.resolve.duration 0.40 0.46 +15.0% ❌
s100.symbol.resolve.duration 4.18 3.99 -4.6% ▫️

s101-real-cold

Iteration statistics

Stat Baseline Candidate
Samples 5 5
Median (ms) 1.72 1.67
Baseline MAD (ms) 0.03 —
Δ median — -3.2%
z (Δ/MAD) — -1.98

s101-real-warm

Iteration statistics

Stat Baseline Candidate
Samples 5 5
Median (ms) 1.68 1.66
Baseline MAD (ms) 0.05 —
Δ median — -1.6%
z (Δ/MAD) — -0.53

s101-render-repeat

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 53.90 53.63
Baseline MAD (ms) 1.68 —
Δ median — -0.5%
z (Δ/MAD) — -0.16

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.lua.execute 798.75 810.40 +1.5% ▫️
s100.lua.rule.invoke 645.72 654.80 +1.4% ▫️
s100.pipeline.vector.execute_rules 802.73 814.46 +1.5% ▫️
s100.pipeline.vector.stage.lua 799.10 810.73 +1.5% ▫️
s100.pipeline.vector.stage.rule_select 0.58 0.62 +7.2% ❌
s100.pipeline.vector.stage.sort 2.46 2.55 +3.9% ▫️
s100.pipeline.vector.stage.viewing_groups 33.93 33.66 -0.8% ▫️
s100.render.frame 1923.18 1939.33 +0.8% ▫️

Metrics

Metric Baseline Candidate Delta Status
s100.catalogue.match.count 1.00 1.00 +0.0% ▫️
s100.featurecatalogue.cache.hit.count 70.00 70.00 +0.0% ▫️
s100.lua.execute.duration 159.51 151.49 -5.0% ▫️
s100.lua.feature.instructions.count 1.00 1.00 +0.0% ▫️
s100.lua.feature.instructions.count 18.00 18.00 +0.0% ▫️
s100.lua.feature.instructions.count 80.00 80.00 +0.0% ▫️
s100.lua.feature.instructions.count 2.00 2.00 +0.0% ▫️
s100.lua.feature.instructions.count 8.00 8.00 +0.0% ▫️
s100.lua.feature.instructions.count 1.00 1.00 +0.0% ▫️
s100.lua.feature.instructions.count 1.00 1.00 +0.0% ▫️
s100.lua.feature.instructions.count 30.00 30.00 +0.0% ▫️
s100.lua.feature.instructions.count 10.00 10.00 +0.0% ▫️
s100.lua.feature.instructions.count 2.00 2.00 +0.0% ▫️
s100.lua.feature.instructions.count 2.00 2.00 +0.0% ▫️
s100.lua.features.count 155.00 155.00 +0.0% ▫️
s100.lua.instructions.emitted.count 328.00 328.00 +0.0% ▫️
s100.lua.rule.invoke.count 1.00 1.00 +0.0% ▫️
s100.lua.rule.invoke.count 11.00 11.00 +0.0% ▫️
s100.lua.rule.invoke.duration 128.38 121.10 -5.7% ▫️
s100.lua.rule.invoke.duration 0.42 0.46 +9.4% ❌
s100.lua.source.cache.hit.count 215.00 215.00 +0.0% ▫️
s100.pattern.cache.hit.count 2586.00 2586.00 +0.0% ▫️
s100.pattern.cache.miss.count 4.00 4.00 +0.0% ▫️
s100.pipeline.features.in 11.00 11.00 +0.0% ▫️
s100.pipeline.stage.duration 159.57 151.56 -5.0% ▫️
s100.pipeline.stage.duration 0.12 0.14 +14.5% ❌
s100.pipeline.stage.duration 0.43 0.49 +13.7% ❌
s100.pipeline.stage.duration 5.67 6.00 +5.8% ❌
s100.pipeline.stage.instructions.count 328.00 328.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 328.00 328.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 22960.00 22960.00 +0.0% ▫️
s100.portrayal.cache.hit.count 280.00 280.00 +0.0% ▫️
s100.portrayal.cache.hit.count 215.00 215.00 +0.0% ▫️
s100.portrayal.cache.hit.count 70.00 70.00 +0.0% ▫️
s100.portrayal.cache.hit.count 2380.00 2380.00 +0.0% ▫️
s100.render.frame.duration 292.14 323.63 +10.8% ❌
s100.render.instructions.processed.count 22960.00 22960.00 +0.0% ▫️
s100.render.styles.applied.count 24290.00 24290.00 +0.0% ▫️
s100.symbol.cache.hit.count 4870.00 4870.00 +0.0% ▫️
s100.symbol.cache.miss.count 30.00 30.00 +0.0% ▫️
s100.symbol.resolve.duration 5.08 5.53 +8.7% ❌
s100.symbol.resolve.duration 4.27 4.08 -4.5% ▫️

s101-render-warm

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 5.25 5.33
Baseline MAD (ms) 0.09 —
Δ median — +1.5%
z (Δ/MAD) — +0.85

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.lua.execute 742.57 741.98 -0.1% ▫️
s100.lua.rule.invoke 598.95 586.18 -2.1% ▫️
s100.pipeline.vector.execute_rules 746.48 745.86 -0.1% ▫️
s100.pipeline.vector.stage.lua 742.91 742.29 -0.1% ▫️
s100.pipeline.vector.stage.rule_select 0.64 0.63 -1.0% ▫️
s100.pipeline.vector.stage.sort 2.33 2.27 -2.4% ▫️
s100.pipeline.vector.stage.viewing_groups 2.98 6.47 +117.0% ❌
s100.render.frame 612.15 660.10 +7.8% ❌

Metrics

Metric Baseline Candidate Delta Status
s100.catalogue.match.count 1.00 1.00 +0.0% ▫️
s100.featurecatalogue.cache.hit.count 7.00 7.00 +0.0% ▫️
s100.lua.execute.duration 146.26 144.30 -1.3% ▫️
s100.lua.feature.instructions.count 1.00 1.00 +0.0% ▫️
s100.lua.feature.instructions.count 18.00 18.00 +0.0% ▫️
s100.lua.feature.instructions.count 80.00 80.00 +0.0% ▫️
s100.lua.feature.instructions.count 2.00 2.00 +0.0% ▫️
s100.lua.feature.instructions.count 8.00 8.00 +0.0% ▫️
s100.lua.feature.instructions.count 1.00 1.00 +0.0% ▫️
s100.lua.feature.instructions.count 1.00 1.00 +0.0% ▫️
s100.lua.feature.instructions.count 30.00 30.00 +0.0% ▫️
s100.lua.feature.instructions.count 10.00 10.00 +0.0% ▫️
s100.lua.feature.instructions.count 2.00 2.00 +0.0% ▫️
s100.lua.feature.instructions.count 2.00 2.00 +0.0% ▫️
s100.lua.features.count 155.00 155.00 +0.0% ▫️
s100.lua.instructions.emitted.count 328.00 328.00 +0.0% ▫️
s100.lua.rule.invoke.count 1.00 1.00 +0.0% ▫️
s100.lua.rule.invoke.count 11.00 11.00 +0.0% ▫️
s100.lua.rule.invoke.duration 118.00 113.94 -3.4% ▫️
s100.lua.rule.invoke.duration 0.50 0.48 -3.5% ▫️
s100.lua.source.cache.hit.count 215.00 215.00 +0.0% ▫️
s100.pattern.cache.hit.count 255.00 255.00 +0.0% ▫️
s100.pattern.cache.miss.count 4.00 4.00 +0.0% ▫️
s100.pipeline.features.in 11.00 11.00 +0.0% ▫️
s100.pipeline.stage.duration 146.33 144.36 -1.3% ▫️
s100.pipeline.stage.duration 0.12 0.13 +11.4% ❌
s100.pipeline.stage.duration 0.44 0.44 +1.2% ▫️
s100.pipeline.stage.duration 0.47 0.52 +10.9% ❌
s100.pipeline.stage.instructions.count 328.00 328.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 328.00 328.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 2296.00 2296.00 +0.0% ▫️
s100.portrayal.cache.hit.count 28.00 28.00 +0.0% ▫️
s100.portrayal.cache.hit.count 215.00 215.00 +0.0% ▫️
s100.portrayal.cache.hit.count 7.00 7.00 +0.0% ▫️
s100.portrayal.cache.hit.count 238.00 238.00 +0.0% ▫️
s100.render.frame.duration 113.20 109.47 -3.3% ▫️
s100.render.instructions.processed.count 2296.00 2296.00 +0.0% ▫️
s100.render.styles.applied.count 2429.00 2429.00 +0.0% ▫️
s100.symbol.cache.hit.count 460.00 460.00 +0.0% ▫️
s100.symbol.cache.miss.count 30.00 30.00 +0.0% ▫️
s100.symbol.resolve.duration 0.49 0.51 +3.5% ▫️
s100.symbol.resolve.duration 7.53 4.41 -41.4% ✅

s102-coverage

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 1.57 1.62
Baseline MAD (ms) 0.03 —
Δ median — +3.1%
z (Δ/MAD) — +1.44

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.coverage.pyramid.build 5.57 5.67 +1.8% ▫️
s100.dataset.open 323.86 328.04 +1.3% ▫️
s100.hdf5.dataset.read 154.88 156.75 +1.2% ▫️
s100.hdf5.file.open 83.48 83.24 -0.3% ▫️
s100.hdf5.open 34.22 34.43 +0.6% ▫️
s100.pipeline.coverage.process 62.00 63.39 +2.2% ▫️
s100.pipeline.coverage.stage.read 11.54 11.10 -3.8% ▫️
s100.pipeline.coverage.stage.resolve 44.43 45.34 +2.0% ▫️
s100.render.coverage.build 37.31 37.63 +0.8% ▫️

Metrics

Metric Baseline Candidate Delta Status
s100.catalogue.match.count 1.00 1.00 +0.0% ▫️
s100.coverage.cells 4557.00 4557.00 +0.0% ▫️
s100.coverage.overview.level_selected 0.00 0.00 N/A ▫️
s100.coverage.pyramid.build.duration 0.94 0.92 -2.5% ▫️
s100.hdf5.read.bytes 5208.00 5208.00 +0.0% ▫️
s100.hdf5.read.duration 30.08 29.90 -0.6% ▫️
s100.hdf5.read.duration 30.67 30.53 -0.5% ▫️
s100.hdf5.read.duration 6.85 6.74 -1.6% ▫️
s100.pipeline.duration 12.10 12.93 +6.8% ❌
s100.pipeline.stage.duration 1.36 1.42 +4.2% ▫️
s100.pipeline.stage.duration 8.68 9.40 +8.3% ❌
s100.portrayal.cache.hit.count 7.00 7.00 +0.0% ▫️

s102-coverage-open

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 2.40 2.54
Baseline MAD (ms) 0.05 —
Δ median — +5.9%
z (Δ/MAD) — +3.16

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.dataset.open 62.13 65.05 +4.7% ▫️
s100.hdf5.dataset.read 10.74 11.35 +5.7% ❌
s100.hdf5.file.open 23.65 22.80 -3.6% ▫️
s100.hdf5.open 3.98 4.10 +3.1% ▫️

Metrics

Metric Baseline Candidate Delta Status
s100.hdf5.read.bytes 36456.00 36456.00 +0.0% ▫️
s100.hdf5.read.duration 6.64 7.39 +11.2% ❌
s100.hdf5.read.duration 1.96 2.43 +24.0% ❌
s100.hdf5.read.duration 0.67 0.73 +9.7% ❌

s102-coverage-render-large

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 154.16 152.89
Baseline MAD (ms) 2.50 —
Δ median — -0.8%
z (Δ/MAD) — -0.50

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.coverage.pyramid.build 232.06 225.53 -2.8% ▫️
s100.dataset.open 95.06 94.22 -0.9% ▫️
s100.hdf5.dataset.read 26.38 25.86 -2.0% ▫️
s100.hdf5.file.open 14.98 14.36 -4.2% ▫️
s100.hdf5.open 6.73 6.63 -1.5% ▫️
s100.pipeline.coverage.process 367.99 397.27 +8.0% ❌
s100.pipeline.coverage.stage.read 280.13 285.75 +2.0% ▫️
s100.pipeline.coverage.stage.resolve 82.94 105.88 +27.7% ❌
s100.render.coverage.build 5187.17 5333.76 +2.8% ▫️

Metrics

Metric Baseline Candidate Delta Status
s100.catalogue.match.count 1.00 1.00 +0.0% ▫️
s100.coverage.cells 7000000.00 7000000.00 +0.0% ▫️
s100.coverage.overview.level_selected 0.00 0.00 N/A ▫️
s100.coverage.pyramid.build.duration 47.52 45.02 -5.3% ▫️
s100.hdf5.read.bytes 8000000.00 8000000.00 +0.0% ▫️
s100.hdf5.read.duration 0.23 0.19 -19.6% ✅
s100.hdf5.read.duration 5.32 5.22 -1.9% ▫️
s100.hdf5.read.duration 1.37 1.32 -3.6% ▫️
s100.pipeline.duration 73.30 73.67 +0.5% ▫️
s100.pipeline.stage.duration 55.94 56.33 +0.7% ▫️
s100.pipeline.stage.duration 16.16 15.94 -1.4% ▫️
s100.portrayal.cache.hit.count 7.00 7.00 +0.0% ▫️

s102-coverage-render-repeat

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 955.97 962.47
Baseline MAD (ms) 6.51 —
Δ median — +0.7%
z (Δ/MAD) — +1.00

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.coverage.pyramid.build 213.43 212.87 -0.3% ▫️
s100.dataset.open 29.40 37.86 +28.8% ❌
s100.hdf5.dataset.read 6.65 9.67 +45.5% ❌
s100.hdf5.file.open 1.60 1.61 +0.4% ▫️
s100.hdf5.open 4.24 4.12 -2.8% ▫️
s100.pipeline.coverage.process 2461.97 2528.68 +2.7% ▫️
s100.pipeline.coverage.stage.read 2012.85 2091.28 +3.9% ▫️
s100.pipeline.coverage.stage.resolve 420.55 408.26 -2.9% ▫️
s100.render.coverage.build 36982.61 37196.74 +0.6% ▫️

Metrics

Metric Baseline Candidate Delta Status
s100.catalogue.match.count 1.00 1.00 +0.0% ▫️
s100.coverage.cells 70000000.00 70000000.00 +0.0% ▫️
s100.coverage.overview.level_selected 0.00 0.00 N/A ▫️
s100.coverage.pyramid.build.duration 41.80 42.86 +2.5% ▫️
s100.hdf5.read.bytes 8000000.00 8000000.00 +0.0% ▫️
s100.hdf5.read.duration 0.24 0.20 -16.7% ✅
s100.hdf5.read.duration 1.52 1.36 -10.4% ✅
s100.hdf5.read.duration 0.79 0.83 +5.8% ❌
s100.pipeline.duration 504.40 520.12 +3.1% ▫️
s100.pipeline.stage.duration 419.53 437.64 +4.3% ▫️
s100.pipeline.stage.duration 78.52 76.37 -2.7% ▫️
s100.portrayal.cache.hit.count 70.00 70.00 +0.0% ▫️

s102-coverage-viewport-fit

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 94.11 91.06
Baseline MAD (ms) 3.75 —
Δ median — -3.2%
z (Δ/MAD) — -0.81

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.coverage.pyramid.build 207.18 300.89 +45.2% ❌
s100.dataset.open 42.44 39.83 -6.2% ▫️
s100.hdf5.dataset.read 12.50 12.23 -2.2% ▫️
s100.hdf5.file.open 1.65 1.54 -6.4% ▫️
s100.hdf5.open 3.70 3.70 -+0.0% ▫️
s100.pipeline.coverage.process 249.45 236.41 -5.2% ▫️
s100.pipeline.coverage.stage.read 212.34 201.14 -5.3% ▫️
s100.pipeline.coverage.stage.resolve 34.64 32.96 -4.9% ▫️
s100.render.coverage.build 3108.94 3080.62 -0.9% ▫️

Metrics

Metric Baseline Candidate Delta Status
s100.catalogue.match.count 1.00 1.00 +0.0% ▫️
s100.coverage.cells 7000000.00 7000000.00 +0.0% ▫️
s100.coverage.overview.level_selected 0.00 0.00 N/A ▫️
s100.coverage.pyramid.build.duration 43.00 41.73 -3.0% ▫️
s100.hdf5.read.bytes 8000000.00 8000000.00 +0.0% ▫️
s100.hdf5.read.duration 0.23 0.25 +10.3% ❌
s100.hdf5.read.duration 4.34 1.17 -73.1% ✅
s100.hdf5.read.duration 0.70 0.72 +2.9% ▫️
s100.pipeline.duration 45.51 43.27 -4.9% ▫️
s100.pipeline.stage.duration 39.17 36.82 -6.0% ▫️
s100.pipeline.stage.duration 5.80 5.93 +2.3% ▫️
s100.portrayal.cache.hit.count 7.00 7.00 +0.0% ▫️

s102-coverage-viewport-zoomed-in

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 1.63 1.84
Baseline MAD (ms) 0.06 —
Δ median — +12.6%
z (Δ/MAD) — +3.21

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.coverage.pyramid.build 41.89 45.18 +7.9% ❌
s100.dataset.open 56.48 28.30 -49.9% ✅
s100.hdf5.dataset.read 18.25 9.25 -49.3% ✅
s100.hdf5.file.open 1.30 1.75 +35.2% ❌
s100.hdf5.open 3.11 3.99 +28.3% ❌
s100.pipeline.coverage.process 28.80 31.56 +9.6% ❌
s100.pipeline.coverage.stage.read 2.34 2.15 -8.1% ▫️
s100.pipeline.coverage.stage.resolve 25.14 28.27 +12.4% ❌
s100.render.coverage.build 35.58 38.93 +9.4% ❌

Metrics

Metric Baseline Candidate Delta Status
s100.catalogue.match.count 1.00 1.00 +0.0% ▫️
s100.coverage.cells 70000.00 70000.00 +0.0% ▫️
s100.coverage.overview.level_selected 0.00 0.00 N/A ▫️
s100.coverage.pyramid.build.duration 16.28 8.05 -50.5% ✅
s100.hdf5.read.bytes 8000000.00 8000000.00 +0.0% ▫️
s100.hdf5.read.duration 0.18 0.17 -2.8% ▫️
s100.hdf5.read.duration 4.31 1.31 -69.5% ✅
s100.hdf5.read.duration 0.61 0.70 +14.2% ❌
s100.pipeline.duration 5.93 5.33 -10.0% ✅
s100.pipeline.stage.duration 0.46 0.42 -8.6% ▫️
s100.pipeline.stage.duration 5.19 4.64 -10.7% ✅
s100.portrayal.cache.hit.count 7.00 7.00 +0.0% ▫️

s102-coverage-viewport-zoomed-out

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 6.50 6.43
Baseline MAD (ms) 0.27 —
Δ median — -1.1%
z (Δ/MAD) — -0.26

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.coverage.pyramid.build 37.92 49.60 +30.8% ❌
s100.dataset.open 30.25 40.06 +32.4% ❌
s100.hdf5.dataset.read 6.80 9.25 +36.0% ❌
s100.hdf5.file.open 1.27 1.28 +1.2% ▫️
s100.hdf5.open 3.04 3.15 +3.6% ▫️
s100.pipeline.coverage.process 65.29 69.07 +5.8% ❌
s100.pipeline.coverage.stage.read 39.79 40.43 +1.6% ▫️
s100.pipeline.coverage.stage.resolve 23.76 26.86 +13.0% ❌
s100.render.coverage.build 188.28 192.79 +2.4% ▫️

Metrics

Metric Baseline Candidate Delta Status
s100.catalogue.match.count 1.00 1.00 +0.0% ▫️
s100.coverage.cells 437500.00 437500.00 +0.0% ▫️
s100.coverage.overview.level_selected 14.00 14.00 +0.0% ▫️
s100.coverage.pyramid.build.duration 6.38 6.09 -4.4% ▫️
s100.hdf5.read.bytes 8000000.00 8000000.00 +0.0% ▫️
s100.hdf5.read.duration 0.20 0.17 -16.6% ✅
s100.hdf5.read.duration 1.94 1.30 -33.1% ✅
s100.hdf5.read.duration 0.55 0.56 +1.1% ▫️
s100.pipeline.duration 12.23 13.14 +7.4% ❌
s100.pipeline.stage.duration 7.57 7.62 +0.7% ▫️
s100.pipeline.stage.duration 4.30 5.10 +18.6% ❌
s100.portrayal.cache.hit.count 7.00 7.00 +0.0% ▫️

s102-real-warm

Iteration statistics

Stat Baseline Candidate
Samples 5 5
Median (ms) 0.39 0.37
Baseline MAD (ms) 0.04 —
Δ median — -6.7%
z (Δ/MAD) — -0.66

s111-arrow-repeat

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 4.47 4.34
Baseline MAD (ms) 0.46 —
Δ median — -2.9%
z (Δ/MAD) — -0.28

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.dataset.open 84.50 89.43 +5.8% ❌
s100.hdf5.dataset.read 37.31 41.04 +10.0% ❌
s100.hdf5.file.open 6.64 6.13 -7.6% ▫️
s100.hdf5.open 0.93 0.96 +2.5% ▫️
s100.pipeline.coverage.process 99.76 94.44 -5.3% ▫️
s100.pipeline.coverage.stage.read 80.47 79.90 -0.7% ▫️
s100.pipeline.coverage.stage.resolve 10.13 5.23 -48.3% ✅

Metrics

Metric Baseline Candidate Delta Status
s100.catalogue.match.count 1.00 1.00 +0.0% ▫️
s100.coverage.cells 196630.00 196630.00 +0.0% ▫️
s100.coverage.overview.level_selected 0.00 0.00 N/A ▫️
s100.hdf5.read.bytes 22472.00 22472.00 +0.0% ▫️
s100.hdf5.read.duration 8.08 7.54 -6.7% ▫️
s100.hdf5.read.duration 7.75 11.64 +50.1% ❌
s100.hdf5.read.duration 0.21 0.17 -18.6% ✅
s100.pipeline.duration 19.17 22.24 +16.0% ❌
s100.pipeline.stage.duration 15.84 19.34 +22.1% ❌
s100.pipeline.stage.duration 1.00 1.02 +1.7% ▫️
s100.portrayal.cache.hit.count 70.00 70.00 +0.0% ▫️

s111-real-warm

Iteration statistics

Stat Baseline Candidate
Samples 5 5
Median (ms) 0.27 0.30
Baseline MAD (ms) 0.03 —
Δ median — +13.9%
z (Δ/MAD) — +1.40

s124-vector

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 0.28 0.26
Baseline MAD (ms) 0.01 —
Δ median — -4.9%
z (Δ/MAD) — -1.17

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.dataset.open 22.07 22.42 +1.6% ▫️
s100.featurecatalogue.parse 7.35 8.08 +9.9% ❌
s100.pipeline.vector.process 278.50 298.03 +7.0% ❌
s100.pipeline.vector.stage.assemble 1.33 1.27 -4.1% ▫️
s100.pipeline.vector.stage.feature_xml 7.16 7.05 -1.6% ▫️
s100.pipeline.vector.stage.rule_select 4.71 4.70 -+0.0% ▫️
s100.pipeline.vector.stage.sort 0.24 0.28 +16.3% ❌
s100.pipeline.vector.stage.viewing_groups 0.48 0.48 +0.5% ▫️
s100.pipeline.vector.stage.xslt 262.70 282.40 +7.5% ❌
s100.render.frame 2.72 2.63 -3.3% ▫️
s100.xslt.compile 203.38 227.12 +11.7% ❌
s100.xslt.transform 37.33 37.39 +0.2% ▫️

Metrics

Metric Baseline Candidate Delta Status
s100.catalogue.match.count 1.00 1.00 +0.0% ▫️
s100.featurecatalogue.cache.miss.count 1.00 1.00 +0.0% ▫️
s100.pipeline.drawinginstructions.out 0.00 0.00 N/A ▫️
s100.pipeline.duration 58.42 58.09 -0.6% ▫️
s100.pipeline.features.in 0.00 0.00 N/A ▫️
s100.pipeline.stage.duration 0.27 0.25 -8.6% ▫️
s100.pipeline.stage.duration 1.51 1.41 -6.4% ▫️
s100.pipeline.stage.duration 0.93 0.92 -0.8% ▫️
s100.pipeline.stage.duration 0.04 0.06 +39.9% ❌
s100.pipeline.stage.duration 0.08 0.08 -1.1% ▫️
s100.pipeline.stage.duration 55.15 54.90 -0.4% ▫️
s100.pipeline.stage.instructions.count 0.00 0.00 N/A ▫️
s100.pipeline.stage.instructions.count 0.00 0.00 N/A ▫️
s100.pipeline.stage.instructions.count 0.00 0.00 N/A ▫️
s100.portrayal.cache.hit.count 7.00 7.00 +0.0% ▫️
s100.portrayal.cache.hit.count 6.00 6.00 +0.0% ▫️
s100.portrayal.cache.miss.count 1.00 1.00 +0.0% ▫️
s100.render.frame.duration 0.15 0.12 -21.2% ✅
s100.render.instructions.processed.count 0.00 0.00 N/A ▫️
s100.render.styles.applied.count 0.00 0.00 N/A ▫️
s100.xslt.transform.duration 7.75 7.78 +0.4% ▫️

s201-vector

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 0.34 0.34
Baseline MAD (ms) 0.03 —
Δ median — -0.4%
z (Δ/MAD) — -0.04

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.dataset.open 26.26 25.90 -1.4% ▫️
s100.featurecatalogue.parse 26.95 30.98 +14.9% ❌
s100.pipeline.vector.process 804.89 819.25 +1.8% ▫️
s100.pipeline.vector.stage.assemble 0.13 0.13 +2.6% ▫️
s100.pipeline.vector.stage.feature_xml 35.23 38.11 +8.2% ❌
s100.pipeline.vector.stage.rule_select 1.51 1.37 -9.2% ▫️
s100.pipeline.vector.stage.sort 0.18 0.16 -14.2% ✅
s100.pipeline.vector.stage.viewing_groups 0.21 0.21 +0.2% ▫️
s100.pipeline.vector.stage.xslt 766.28 777.91 +1.5% ▫️
s100.render.frame 2.34 2.42 +3.2% ▫️
s100.xslt.compile 636.05 653.13 +2.7% ▫️
s100.xslt.transform 127.62 122.28 -4.2% ▫️

Metrics

Metric Baseline Candidate Delta Status
s100.catalogue.match.count 1.00 1.00 +0.0% ▫️
s100.featurecatalogue.cache.miss.count 1.00 1.00 +0.0% ▫️
s100.pipeline.drawinginstructions.out 0.00 0.00 N/A ▫️
s100.pipeline.duration 167.85 167.36 -0.3% ▫️
s100.pipeline.features.in 7.00 7.00 +0.0% ▫️
s100.pipeline.stage.duration 0.01 0.01 +5.9% ❌
s100.pipeline.stage.duration 7.23 8.39 +16.1% ❌
s100.pipeline.stage.duration 0.32 0.24 -23.8% ✅
s100.pipeline.stage.duration 0.05 0.03 -47.1% ✅
s100.pipeline.stage.duration 0.03 0.04 +49.8% ❌
s100.pipeline.stage.duration 159.86 158.28 -1.0% ▫️
s100.pipeline.stage.instructions.count 0.00 0.00 N/A ▫️
s100.pipeline.stage.instructions.count 0.00 0.00 N/A ▫️
s100.pipeline.stage.instructions.count 0.00 0.00 N/A ▫️
s100.portrayal.cache.hit.count 7.00 7.00 +0.0% ▫️
s100.portrayal.cache.hit.count 6.00 6.00 +0.0% ▫️
s100.portrayal.cache.miss.count 1.00 1.00 +0.0% ▫️
s100.render.frame.duration 0.06 0.06 -4.2% ▫️
s100.render.instructions.processed.count 0.00 0.00 N/A ▫️
s100.render.styles.applied.count 0.00 0.00 N/A ▫️
s100.xslt.transform.duration 30.35 26.89 -11.4% ✅

Generated by EncDotNet.S100.PerfReport gate command

@philliphoff
philliphoff merged commit 2258ad1 into main Oct 31, 2026
14 checks passed
@philliphoff
philliphoff deleted the claude/measure-range-bearing-design branch October 31, 2026 20:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant