Skip to content

Add agent-automation CLI flags to the Viewer#146

Merged
philliphoff merged 4 commits into
mainfrom
copilot/review-cli-structure-viewer
Jun 1, 2026
Merged

Add agent-automation CLI flags to the Viewer#146
philliphoff merged 4 commits into
mainfrom
copilot/review-cli-structure-viewer

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented May 30, 2026

Summary

The Viewer could only be driven through its GUI, so an agent could not launch it with a dataset, frame a known state, talk to it over MCP, or capture diagnostics without manual interaction — and any scripted run wrote MCP ports and palette/category overrides back into the user's real profile. This adds additive CLI flags to make those loops scriptable while keeping the bare viewer <datasets> invocation unchanged.

  • MCP over the CLI--mcp, --mcp-port, --mcp-bind, --mcp-port-file (any MCP flag implies --mcp). The bound endpoint is written to the port-file and echoed to stdout ([MCP] listening on …) for ephemeral-port discovery. CLI-driven MCP runs never persist the bound port back to settings.json.
  • Settings isolation--settings <PATH> (alternate file) and --ephemeral (throwaway, never written back) keep the real profile pristine and let parallel runs avoid collisions.
  • Deterministic viewport--center/--zoom and --bbox, applied after load, suppress auto-zoom-to-extent.
  • Robust screenshot — render-quiesce wait replaces the fixed 2s delay; adds --exit-after-screenshot, --full-window, --window-size.
  • Render state--palette, --display-category, --time-step override persisted values for the run only.
  • Diagnostics--log-file, -v/--verbose, and a configurable --crash-log (no longer hardcoded /tmp/viewer-crash.log).

Override-layering lives in a GUI-free StartupSettingsFactory; MCP no-persist/endpoint-publish lives in McpServerHost; viewport/screenshot/time-step orchestration is in MainWindow.RunStartupAutomationAsync.

dotnet run --project src/EncDotNet.S100.Viewer -- \
  --ephemeral --mcp --mcp-port-file /tmp/run/mcp.url \
  --bbox 47.5,-122.5,47.7,-122.1 --palette Night \
  --screenshot /tmp/run/map.png --exit-after-screenshot \
  path/to/dataset.h5

Deferred as optional follow-ups: a headless --dump-features and a Spectre subcommand restructure.

Spec alignment

Check each spec this PR touches and confirm the relevant skill was
consulted (.github/skills/<spec>/SKILL.md):

  • S-100 framework (s100-framework)
  • S-101 ENC (s101-enc)
  • S-102 bathymetry (s102-bathymetry)
  • S-104 water level (s104-water-level)
  • S-111 surface currents (s111-surface-currents)
  • S-124 navigational warnings (s124-nav-warnings)
  • S-129 under keel clearance (s129-ukc)
  • N/A — change is purely infrastructural (build, CI, docs, tooling)

Spec section references cited in code/docs:

N/A — viewer tooling only.

Tests

  • Added/updated xunit tests under tests/
  • Tests requiring real data files use SkippableFact
  • dotnet test --configuration Release passes locally

Added ViewerCommandSettingsTests, StartupSettingsFactoryTests, and McpServerHostCommandLineTests (42 new; 468 viewer tests pass). GUI-coupled behavior (viewport, screenshot timing, window-size, time-step re-render) was code-reviewed but not executed — no display in CI.

Documentation

  • Updated the affected project's src/<project>/README.md
  • Updated conceptual docs under docs/ if user-facing behaviour
    changed
  • New public APIs have XML doc comments

Added "Automation / agent control" sections (flag table + end-to-end walkthrough) to src/EncDotNet.S100.Viewer/README.md and docs/mcp-server.md.

Dependencies

  • No new NuGet dependencies, OR versions added to
    Directory.Packages.props (not in the .csproj)
  • gh-advisory-database security check run for any new dependency

Breaking changes

None. All flags are additive; viewer <datasets> and the GUI MCP toggle behave as before. The MCP port is now persisted only for GUI/settings-driven runs, not CLI-driven ones.

Spectre.Console.Cli rejects ',', 'x', and '|' inside the <NAME> portion
of CommandOption templates, so 'viewer --help' threw 'Encountered
invalid character ... in value name'. Use simple identifiers (<SIZE>,
<LATLON>, <BBOX>, <STEP>); the descriptions still document the expected
format.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@philliphoff philliphoff marked this pull request as ready for review June 1, 2026 00:27
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

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 +4.1 +0.61 0.57 20/20
s101-portray-cold ✅ pass -1.0 -0.38 410.71 20/20
s101-portray-warm ✅ pass -0.1 -0.03 246.86 20/20
s101-render-warm ✅ pass -0.4 -0.22 236.54 20/20
s102-coverage ✅ pass +0.2 +0.12 1.06 20/20
s102-coverage-open ✅ pass -1.4 -0.48 2.60 20/20
s102-coverage-render-large ✅ pass -0.2 -0.10 139.83 20/20
s124-vector ✅ pass -7.0 -1.14 0.34 20/20
s201-vector ✅ pass -10.0 -2.65 0.37 20/20

exchange-set-open

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 0.57 0.60
Baseline MAD (ms) 0.04
Δ median +4.1%
z (Δ/MAD) +0.61

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.asset.read 10.68 10.68 -+0.0% ▫️
s100.exchangeset.parse 41.39 41.28 -0.3% ▫️

Metrics

Metric Baseline Candidate Delta Status
s100.asset.read.duration 18.34 18.01 -1.8% ▫️

s101-portray-cold

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 410.71 406.64
Baseline MAD (ms) 10.74
Δ median -1.0%
z (Δ/MAD) -0.38

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.lua.execute 7865.47 7481.97 -4.9% ▫️
s100.lua.rule.invoke 6805.00 6432.40 -5.5% ▫️
s100.pipeline.vector.process 8119.00 7715.41 -5.0% ▫️
s100.pipeline.vector.stage.assemble 0.20 0.24 +16.7%
s100.pipeline.vector.stage.feature_xml 195.10 170.46 -12.6%
s100.pipeline.vector.stage.lua 7867.26 7483.63 -4.9% ▫️
s100.pipeline.vector.stage.rule_select 6.06 12.91 +113.2%
s100.pipeline.vector.stage.sort 13.67 12.28 -10.2%
s100.pipeline.vector.stage.viewing_groups 15.59 14.30 -8.2% ▫️
s100.pipeline.vector.stage.xslt 0.26 0.33 +27.5%
s100.render.frame 1842.04 1834.66 -0.4% ▫️

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 2704.15 2571.89 -4.9% ▫️
s100.lua.feature.instructions.count 28.00 28.00 +0.0% ▫️
s100.lua.feature.instructions.count 63.00 63.00 +0.0% ▫️
s100.lua.feature.instructions.count 63.00 63.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.feature.instructions.count 42.00 42.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 7.00 7.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 217.00 217.00 +0.0% ▫️
s100.lua.feature.instructions.count 840.00 840.00 +0.0% ▫️
s100.lua.feature.instructions.count 49.00 49.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 49.00 49.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 21.00 21.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 49.00 49.00 +0.0% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.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 840.00 840.00 +0.0% ▫️
s100.lua.feature.instructions.count 28.00 28.00 +0.0% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 28.00 28.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.features.count 2478.00 2478.00 +0.0% ▫️
s100.lua.instructions.emitted.count 4004.00 4004.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 2286.57 2169.74 -5.1% ▫️
s100.lua.rule.invoke.duration 4.84 4.92 +1.5% ▫️
s100.lua.source.cache.hit.count 552.00 552.00 +0.0% ▫️
s100.lua.source.cache.miss.count 43.00 43.00 +0.0% ▫️
s100.pattern.cache.hit.count 210.00 210.00 +0.0% ▫️
s100.pattern.cache.miss.count 14.00 14.00 +0.0% ▫️
s100.pipeline.drawinginstructions.out 4004.00 4004.00 +0.0% ▫️
s100.pipeline.duration 2786.45 2648.27 -5.0% ▫️
s100.pipeline.features.in 217.00 217.00 +0.0% ▫️
s100.pipeline.stage.duration 0.28 0.23 -16.2%
s100.pipeline.stage.duration 67.09 54.59 -18.6%
s100.pipeline.stage.duration 2705.59 2573.31 -4.9% ▫️
s100.pipeline.stage.duration 4.68 11.37 +143.0%
s100.pipeline.stage.duration 5.06 4.74 -6.4% ▫️
s100.pipeline.stage.duration 1.03 1.07 +3.7% ▫️
s100.pipeline.stage.duration 0.91 0.84 -7.4% ▫️
s100.pipeline.stage.instructions.count 0.00 0.00 N/A ▫️
s100.pipeline.stage.instructions.count 4004.00 4004.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 4004.00 4004.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 4004.00 4004.00 +0.0% ▫️
s100.portrayal.cache.hit.count 12.00 12.00 +0.0% ▫️
s100.portrayal.cache.hit.count 552.00 552.00 +0.0% ▫️
s100.portrayal.cache.hit.count 7.00 7.00 +0.0% ▫️
s100.portrayal.cache.hit.count 96.00 96.00 +0.0% ▫️
s100.portrayal.cache.miss.count 2.00 2.00 +0.0% ▫️
s100.portrayal.cache.miss.count 43.00 43.00 +0.0% ▫️
s100.portrayal.cache.miss.count 16.00 16.00 +0.0% ▫️
s100.render.frame.duration 718.46 713.73 -0.7% ▫️
s100.render.instructions.processed.count 4004.00 4004.00 +0.0% ▫️
s100.render.styles.applied.count 4256.00 4256.00 +0.0% ▫️
s100.symbol.cache.hit.count 364.00 364.00 +0.0% ▫️
s100.symbol.cache.miss.count 98.00 98.00 +0.0% ▫️
s100.symbol.resolve.duration 0.38 0.37 -3.7% ▫️
s100.symbol.resolve.duration 18.24 17.58 -3.6% ▫️

s101-portray-warm

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 246.86 246.65
Baseline MAD (ms) 7.91
Δ median -0.1%
z (Δ/MAD) -0.03

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.lua.execute 6029.01 6116.61 +1.5% ▫️
s100.lua.rule.invoke 5379.65 5408.00 +0.5% ▫️
s100.pipeline.vector.process 6342.28 6455.27 +1.8% ▫️
s100.pipeline.vector.stage.assemble 0.17 0.17 +3.8% ▫️
s100.pipeline.vector.stage.feature_xml 287.20 312.45 +8.8%
s100.pipeline.vector.stage.lua 6030.18 6117.67 +1.5% ▫️
s100.pipeline.vector.stage.rule_select 3.87 3.95 +2.0% ▫️
s100.pipeline.vector.stage.sort 15.70 16.27 +3.6% ▫️
s100.pipeline.vector.stage.viewing_groups 17.52 17.89 +2.1% ▫️
s100.pipeline.vector.stage.xslt 0.25 0.25 -1.0% ▫️
s100.render.frame 249.43 246.95 -1.0% ▫️

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 1645.40 1624.36 -1.3% ▫️
s100.lua.feature.instructions.count 28.00 28.00 +0.0% ▫️
s100.lua.feature.instructions.count 63.00 63.00 +0.0% ▫️
s100.lua.feature.instructions.count 63.00 63.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.feature.instructions.count 42.00 42.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 7.00 7.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 217.00 217.00 +0.0% ▫️
s100.lua.feature.instructions.count 840.00 840.00 +0.0% ▫️
s100.lua.feature.instructions.count 49.00 49.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 49.00 49.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 21.00 21.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 49.00 49.00 +0.0% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.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 840.00 840.00 +0.0% ▫️
s100.lua.feature.instructions.count 28.00 28.00 +0.0% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 28.00 28.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.features.count 2478.00 2478.00 +0.0% ▫️
s100.lua.instructions.emitted.count 4004.00 4004.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 1469.63 1444.36 -1.7% ▫️
s100.lua.rule.invoke.duration 2.39 2.65 +11.1%
s100.lua.source.cache.hit.count 595.00 595.00 +0.0% ▫️
s100.pattern.cache.hit.count 222.00 222.00 +0.0% ▫️
s100.pattern.cache.miss.count 2.00 2.00 +0.0% ▫️
s100.pipeline.drawinginstructions.out 4004.00 4004.00 +0.0% ▫️
s100.pipeline.duration 1725.00 1706.22 -1.1% ▫️
s100.pipeline.features.in 217.00 217.00 +0.0% ▫️
s100.pipeline.stage.duration 0.02 0.02 +2.6% ▫️
s100.pipeline.stage.duration 71.77 74.35 +3.6% ▫️
s100.pipeline.stage.duration 1645.74 1624.67 -1.3% ▫️
s100.pipeline.stage.duration 1.24 1.21 -2.1% ▫️
s100.pipeline.stage.duration 4.29 4.36 +1.5% ▫️
s100.pipeline.stage.duration 0.37 0.30 -18.6%
s100.pipeline.stage.duration 0.05 0.04 -15.9%
s100.pipeline.stage.instructions.count 0.00 0.00 N/A ▫️
s100.pipeline.stage.instructions.count 4004.00 4004.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 4004.00 4004.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 4004.00 4004.00 +0.0% ▫️
s100.portrayal.cache.hit.count 2.00 2.00 +0.0% ▫️
s100.portrayal.cache.hit.count 595.00 595.00 +0.0% ▫️
s100.portrayal.cache.hit.count 7.00 7.00 +0.0% ▫️
s100.portrayal.cache.hit.count 16.00 16.00 +0.0% ▫️
s100.render.frame.duration 125.90 126.49 +0.5% ▫️
s100.render.instructions.processed.count 4004.00 4004.00 +0.0% ▫️
s100.render.styles.applied.count 4256.00 4256.00 +0.0% ▫️
s100.symbol.cache.hit.count 448.00 448.00 +0.0% ▫️
s100.symbol.cache.miss.count 14.00 14.00 +0.0% ▫️
s100.symbol.resolve.duration 0.36 0.38 +6.9%
s100.symbol.resolve.duration 2.14 2.08 -2.8% ▫️

s101-render-warm

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 236.54 235.59
Baseline MAD (ms) 4.36
Δ median -0.4%
z (Δ/MAD) -0.22

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.lua.execute 5795.61 5732.33 -1.1% ▫️
s100.lua.rule.invoke 5166.61 5147.18 -0.4% ▫️
s100.pipeline.vector.process 5905.94 5826.46 -1.3% ▫️
s100.pipeline.vector.stage.assemble 0.13 0.11 -10.4%
s100.pipeline.vector.stage.feature_xml 93.49 78.13 -16.4%
s100.pipeline.vector.stage.lua 5796.56 5733.20 -1.1% ▫️
s100.pipeline.vector.stage.rule_select 2.35 2.25 -4.4% ▫️
s100.pipeline.vector.stage.sort 9.39 9.22 -1.7% ▫️
s100.pipeline.vector.stage.viewing_groups 11.16 10.75 -3.7% ▫️
s100.pipeline.vector.stage.xslt 0.16 0.15 -9.6% ▫️
s100.render.frame 162.23 159.74 -1.5% ▫️

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 1618.66 1561.69 -3.5% ▫️
s100.lua.feature.instructions.count 28.00 28.00 +0.0% ▫️
s100.lua.feature.instructions.count 63.00 63.00 +0.0% ▫️
s100.lua.feature.instructions.count 63.00 63.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.feature.instructions.count 42.00 42.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 7.00 7.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 217.00 217.00 +0.0% ▫️
s100.lua.feature.instructions.count 840.00 840.00 +0.0% ▫️
s100.lua.feature.instructions.count 49.00 49.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 49.00 49.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 21.00 21.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 49.00 49.00 +0.0% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.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 840.00 840.00 +0.0% ▫️
s100.lua.feature.instructions.count 28.00 28.00 +0.0% ▫️
s100.lua.feature.instructions.count 7.00 7.00 +0.0% ▫️
s100.lua.feature.instructions.count 28.00 28.00 +0.0% ▫️
s100.lua.feature.instructions.count 14.00 14.00 +0.0% ▫️
s100.lua.features.count 2478.00 2478.00 +0.0% ▫️
s100.lua.instructions.emitted.count 4004.00 4004.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 1439.62 1390.18 -3.4% ▫️
s100.lua.rule.invoke.duration 2.04 2.15 +5.5%
s100.lua.source.cache.hit.count 595.00 595.00 +0.0% ▫️
s100.pattern.cache.hit.count 222.00 222.00 +0.0% ▫️
s100.pattern.cache.miss.count 2.00 2.00 +0.0% ▫️
s100.pipeline.drawinginstructions.out 4004.00 4004.00 +0.0% ▫️
s100.pipeline.duration 1647.35 1589.91 -3.5% ▫️
s100.pipeline.features.in 217.00 217.00 +0.0% ▫️
s100.pipeline.stage.duration 0.01 0.02 +3.0% ▫️
s100.pipeline.stage.duration 24.09 23.63 -1.9% ▫️
s100.pipeline.stage.duration 1618.90 1561.91 -3.5% ▫️
s100.pipeline.stage.duration 0.70 0.72 +2.9% ▫️
s100.pipeline.stage.duration 2.44 2.46 +0.8% ▫️
s100.pipeline.stage.duration 0.28 0.29 +3.2% ▫️
s100.pipeline.stage.duration 0.03 0.03 -10.4%
s100.pipeline.stage.instructions.count 0.00 0.00 N/A ▫️
s100.pipeline.stage.instructions.count 4004.00 4004.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 4004.00 4004.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 4004.00 4004.00 +0.0% ▫️
s100.portrayal.cache.hit.count 2.00 2.00 +0.0% ▫️
s100.portrayal.cache.hit.count 595.00 595.00 +0.0% ▫️
s100.portrayal.cache.hit.count 7.00 7.00 +0.0% ▫️
s100.portrayal.cache.hit.count 16.00 16.00 +0.0% ▫️
s100.render.frame.duration 109.48 107.87 -1.5% ▫️
s100.render.instructions.processed.count 4004.00 4004.00 +0.0% ▫️
s100.render.styles.applied.count 4256.00 4256.00 +0.0% ▫️
s100.symbol.cache.hit.count 448.00 448.00 +0.0% ▫️
s100.symbol.cache.miss.count 14.00 14.00 +0.0% ▫️
s100.symbol.resolve.duration 0.22 0.23 +4.7% ▫️
s100.symbol.resolve.duration 1.25 1.09 -12.1%

s102-coverage

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 1.06 1.06
Baseline MAD (ms) 0.02
Δ median +0.2%
z (Δ/MAD) +0.12

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.pipeline.coverage.process 42.78 41.29 -3.5% ▫️
s100.pipeline.coverage.stage.read 4.99 4.96 -0.6% ▫️
s100.pipeline.coverage.stage.resolve 34.45 33.32 -3.3% ▫️
s100.render.coverage.build 79.19 78.56 -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.hdf5.read.bytes 5208.00 5208.00 +0.0% ▫️
s100.hdf5.read.duration 20.90 20.79 -0.5% ▫️
s100.hdf5.read.duration 28.63 28.87 +0.8% ▫️
s100.hdf5.read.duration 7.22 7.36 +1.9% ▫️
s100.pipeline.duration 7.94 8.24 +3.8% ▫️
s100.pipeline.stage.duration 0.94 0.96 +2.2% ▫️
s100.pipeline.stage.duration 6.37 6.77 +6.2%
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.60 2.56
Baseline MAD (ms) 0.08
Δ median -1.4%
z (Δ/MAD) -0.48

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.dataset.open 76.14 71.63 -5.9% ▫️
s100.hdf5.dataset.read 11.43 10.87 -4.8% ▫️
s100.hdf5.file.open 18.37 17.82 -3.0% ▫️
s100.hdf5.open 18.86 18.02 -4.4% ▫️

Metrics

Metric Baseline Candidate Delta Status
s100.hdf5.read.bytes 36456.00 36456.00 +0.0% ▫️
s100.hdf5.read.duration 5.92 5.84 -1.3% ▫️
s100.hdf5.read.duration 2.05 2.18 +6.4%
s100.hdf5.read.duration 4.17 4.14 -0.5% ▫️

s102-coverage-render-large

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 139.83 139.61
Baseline MAD (ms) 2.26
Δ median -0.2%
z (Δ/MAD) -0.10

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.pipeline.coverage.process 196.86 200.47 +1.8% ▫️
s100.pipeline.coverage.stage.read 151.10 152.10 +0.7% ▫️
s100.pipeline.coverage.stage.resolve 43.04 45.70 +6.2%
s100.render.coverage.build 5193.35 4888.02 -5.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.hdf5.read.bytes 8000000.00 8000000.00 +0.0% ▫️
s100.hdf5.read.duration 0.08 0.06 -21.4%
s100.hdf5.read.duration 2.76 2.79 +1.0% ▫️
s100.hdf5.read.duration 1.21 1.20 -0.5% ▫️
s100.pipeline.duration 33.87 37.81 +11.7%
s100.pipeline.stage.duration 25.73 28.38 +10.3%
s100.pipeline.stage.duration 7.58 8.91 +17.5%
s100.portrayal.cache.hit.count 7.00 7.00 +0.0% ▫️

s124-vector

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 0.34 0.31
Baseline MAD (ms) 0.02
Δ median -7.0%
z (Δ/MAD) -1.14

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.pipeline.vector.process 6.85 6.59 -3.8% ▫️
s100.pipeline.vector.stage.assemble 0.25 0.26 +4.3% ▫️
s100.pipeline.vector.stage.feature_xml 0.94 0.89 -5.6% ▫️
s100.pipeline.vector.stage.rule_select 0.26 0.22 -16.1%
s100.pipeline.vector.stage.sort 0.16 0.17 +5.4%
s100.pipeline.vector.stage.viewing_groups 0.38 0.37 -3.1% ▫️
s100.pipeline.vector.stage.xslt 3.36 3.40 +1.3% ▫️
s100.render.frame 0.90 0.75 -16.5%
s100.xslt.transform 1.32 1.45 +10.1%

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 14.00 14.00 +0.0% ▫️
s100.pipeline.duration 51.82 53.54 +3.3% ▫️
s100.pipeline.features.in 7.00 7.00 +0.0% ▫️
s100.pipeline.stage.duration 0.95 1.01 +6.3%
s100.pipeline.stage.duration 3.14 3.18 +1.4% ▫️
s100.pipeline.stage.duration 1.05 1.11 +6.6%
s100.pipeline.stage.duration 0.04 0.05 +14.0%
s100.pipeline.stage.duration 0.07 0.09 +24.9%
s100.pipeline.stage.duration 46.15 47.69 +3.3% ▫️
s100.pipeline.stage.instructions.count 14.00 14.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 14.00 14.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 14.00 14.00 +0.0% ▫️
s100.portrayal.cache.hit.count 13.00 13.00 +0.0% ▫️
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.portrayal.cache.miss.count 1.00 1.00 +0.0% ▫️
s100.render.frame.duration 2.29 2.20 -3.9% ▫️
s100.render.instructions.processed.count 14.00 14.00 +0.0% ▫️
s100.render.styles.applied.count 14.00 14.00 +0.0% ▫️
s100.xslt.transform.duration 9.89 10.08 +1.9% ▫️

s201-vector

Iteration statistics

Stat Baseline Candidate
Samples 20 20
Median (ms) 0.37 0.33
Baseline MAD (ms) 0.01
Δ median -10.0%
z (Δ/MAD) -2.65

Spans (sum of all iterations)

Span Baseline (ms) Candidate (ms) Delta Status
s100.pipeline.vector.process 8.07 7.63 -5.5% ▫️
s100.pipeline.vector.stage.assemble 0.20 0.19 -5.0% ▫️
s100.pipeline.vector.stage.feature_xml 0.92 0.88 -3.8% ▫️
s100.pipeline.vector.stage.rule_select 0.28 0.27 -3.2% ▫️
s100.pipeline.vector.stage.sort 0.09 0.08 -5.5% ▫️
s100.pipeline.vector.stage.viewing_groups 0.37 0.33 -10.0% ▫️
s100.pipeline.vector.stage.xslt 3.51 3.40 -3.1% ▫️
s100.render.frame 0.71 0.64 -9.9% ▫️
s100.xslt.transform 2.31 2.27 -1.9% ▫️

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 7.00 7.00 +0.0% ▫️
s100.pipeline.duration 157.62 144.88 -8.1% ▫️
s100.pipeline.features.in 21.00 21.00 +0.0% ▫️
s100.pipeline.stage.duration 0.57 0.50 -11.5%
s100.pipeline.stage.duration 7.06 7.07 +0.1% ▫️
s100.pipeline.stage.duration 0.14 0.11 -19.0%
s100.pipeline.stage.duration 0.02 0.02 -13.0%
s100.pipeline.stage.duration 0.05 0.04 -18.3%
s100.pipeline.stage.duration 149.32 136.85 -8.4% ▫️
s100.pipeline.stage.instructions.count 7.00 7.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 7.00 7.00 +0.0% ▫️
s100.pipeline.stage.instructions.count 7.00 7.00 +0.0% ▫️
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.portrayal.cache.miss.count 1.00 1.00 +0.0% ▫️
s100.render.frame.duration 1.02 1.06 +3.5% ▫️
s100.render.instructions.processed.count 7.00 7.00 +0.0% ▫️
s100.render.styles.applied.count 14.00 14.00 +0.0% ▫️
s100.symbol.cache.hit.count 6.00 6.00 +0.0% ▫️
s100.symbol.cache.miss.count 1.00 1.00 +0.0% ▫️
s100.symbol.resolve.duration 0.01 0.01 +0.5% ▫️
s100.symbol.resolve.duration 0.75 0.80 +6.8%
s100.xslt.transform.duration 28.01 26.00 -7.2% ▫️

Generated by EncDotNet.S100.PerfReport gate command

@philliphoff philliphoff merged commit 6ee924f into main Jun 1, 2026
10 checks passed
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.

2 participants