Skip to content

fix: hero artwork rung mismatch between the load key and the memory cache - #95

Merged
anderson-oki merged 3 commits into
mainfrom
fix/nec-58-hero-artwork-rung
Oct 4, 2026
Merged

anderson-oki merged 3 commits into
mainfrom
fix/nec-58-hero-artwork-rung

Conversation

@anderson-oki

Copy link
Copy Markdown
Collaborator

The marquee hero's CDN width and decode rung now come from one constant, so the launch prefetch,
the rotation prewarm and the hero view all ask the cache for the same entry. The view previously
inherited the cache's 3840 default while both prefetches warmed 1920, and whichever won the race
set the hero's decode for the session. CatalogHeroRemoteImage takes a required maxPixelSize
and logs the rung and decoded byte count it got. Does not revert the deliberate catalog trades
recorded in NEC-39 (eager home VStack, CatalogContentView at .opacity(0), hero source-byte
retention, lazy-across/eager-down rails).

Closes NEC-58

@coderabbitai

coderabbitai Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 9c56574f-ea16-42a8-9db1-c817b6d3d723
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

OpenNOW benchmark results

swift run OpenNOWBenchmarks all on fix/nec-58-hero-artwork-rung at c86d1cb13b53.

Informational only, not a merge gate. These timings come from a shared CI runner and move
between runs, so this comment claims no regression: there is no stable baseline to compare
against yet. Gating starts only once that baseline exists (Phase 0, P0-2).

Package Operation N Iterations Mean (ms) Min (ms) Max (ms)
OPN.GameServices JSONDecoder.decode([OPNGameInfo]) 96 25 5.932 5.518 6.962
OPN.GameServices JSONEncoder.encode([OPNGameInfo]) 96 25 4.570 3.922 6.892
OPN.GameServices OPNCatalogGameObject init map 96 50 0.207 0.184 0.307
OPN.GameServices OPNCatalogGameObject swiftValue map 96 50 0.236 0.212 0.336
OPN.GameServices OPNCatalogPanelObject init map 96 50 0.668 0.610 0.802
OpenNOW CatalogViewModel.catalogSections equivalent 96 500 0.005 0.004 0.105
OpenNOW CatalogViewModel.marqueeGames equivalent 96 500 0.047 0.039 0.171
OpenNOW selected detail section scan equivalent 96 2000 0.013 0.011 0.090
OpenNOW best image URL derivation equivalent 96 500 0.121 0.107 0.230
OPN.GameServices JSONDecoder.decode([OPNGameInfo]) 500 25 30.080 28.104 44.855
OPN.GameServices JSONEncoder.encode([OPNGameInfo]) 500 25 24.581 21.626 33.162
OPN.GameServices OPNCatalogGameObject init map 500 50 1.103 0.961 1.244
OPN.GameServices OPNCatalogGameObject swiftValue map 500 50 1.167 1.021 1.605
OPN.GameServices OPNCatalogPanelObject init map 500 50 0.981 0.899 1.127
OpenNOW CatalogViewModel.catalogSections equivalent 500 500 0.005 0.004 0.027
OpenNOW CatalogViewModel.marqueeGames equivalent 500 500 0.108 0.095 0.220
OpenNOW selected detail section scan equivalent 500 2000 0.019 0.017 0.055
OpenNOW best image URL derivation equivalent 500 500 0.645 0.554 0.804
OPN.GameServices JSONDecoder.decode([OPNGameInfo]) 1500 25 93.878 84.560 109.812
OPN.GameServices JSONEncoder.encode([OPNGameInfo]) 1500 25 71.878 65.851 91.014
OPN.GameServices OPNCatalogGameObject init map 1500 50 3.179 2.793 3.966
OPN.GameServices OPNCatalogGameObject swiftValue map 1500 50 3.461 3.149 4.626
OPN.GameServices OPNCatalogPanelObject init map 1500 50 2.484 2.287 3.704
OpenNOW CatalogViewModel.catalogSections equivalent 1500 500 0.005 0.004 0.016
OpenNOW CatalogViewModel.marqueeGames equivalent 1500 500 0.307 0.225 8.641
OpenNOW selected detail section scan equivalent 1500 2000 0.047 0.041 0.065
OpenNOW best image URL derivation equivalent 1500 500 2.253 1.866 5.160
OPN.GameServices JSONDecoder.decode([OPNGameInfo]) 3000 25 194.452 176.261 216.972
OPN.GameServices JSONEncoder.encode([OPNGameInfo]) 3000 25 153.170 142.036 171.237
OPN.GameServices OPNCatalogGameObject init map 3000 50 7.214 6.094 10.403
OPN.GameServices OPNCatalogGameObject swiftValue map 3000 50 8.125 7.123 12.168
OPN.GameServices OPNCatalogPanelObject init map 3000 50 2.732 2.492 3.637
OpenNOW CatalogViewModel.catalogSections equivalent 3000 500 0.005 0.004 0.018
OpenNOW CatalogViewModel.marqueeGames equivalent 3000 500 0.251 0.229 0.337
OpenNOW selected detail section scan equivalent 3000 2000 0.050 0.041 0.238
OpenNOW best image URL derivation equivalent 3000 500 4.519 3.435 9.571
OPN.Common OPNStreamPreferences.loadDeviceCapabilities n/a 200 0.480 0.128 48.435
OPN.Common OPNStreamPreferences.loadMicrophoneDeviceOptions n/a 100 0.001 0.000 0.096
OPN.Common OPNStreamPreferences.loadProfile/effectiveProfile n/a 1000 0.543 0.397 1.301

Full JSON: opennow-benchmarks artifact in this workflow run — one file per audit
(benchmark-catalog.json, benchmark-stream-preferences.json). The same JSON is printed in the
Run benchmark suite job log, which outlives the artifact.

Updated in place on every benchmark run for this PR.

@anderson-oki anderson-oki changed the title NEC-58: fix the hero artwork rung mismatch between the load key and the memory cache fix: hero artwork rung mismatch between the load key and the memory cache Oct 4, 2026
@anderson-oki anderson-oki self-assigned this Oct 4, 2026
…rk-rung

# Conflicts:
#	View/Catalog/CatalogContentViews.swift
#	View/Catalog/CatalogHeroImageViews.swift
@anderson-oki
anderson-oki merged commit e20097b into main Oct 4, 2026
7 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.

1 participant