Skip to content

feat: Identity Unification — v10, versionless exe + drift guard (Epic 1, #6)#12

Merged
tcconnally merged 2 commits into
mainfrom
feat/epic1-identity-unification
Jul 2, 2026
Merged

feat: Identity Unification — v10, versionless exe + drift guard (Epic 1, #6)#12
tcconnally merged 2 commits into
mainfrom
feat/epic1-identity-unification

Conversation

@tcconnally

Copy link
Copy Markdown
Owner

Implements Epic 1: Identity Unification (closes #6) — the foundation for the v10 milestone.

Why

The package said v9 but the binary was hyperwall_v8.exe everywhere, and G-Sync isolation was hard-gated on that exact basename (nvidia.py:85). The v8/9.0 string was duplicated across ~15 sites. Bumping the version would have silently disabled G-Sync isolation. This PR makes the version a single source of truth and the exe versionless, so no future bump can ever break isolation again.

What changed

  • __init__.py__version__ = "10.0.0" + derived VERSION_SHORT. A version bump now touches exactly one line.
  • emby.py / wizard.py — User-Agent, Emby auth Version, and window/wizard titles derive from VERSION_SHORT (no more hardcoded "9.0").
  • nvidia.py — new _is_isolated_launch() gates G-Sync isolation on a hyperwall*.exe prefix or HYPERWALL_ISOLATED=1, replacing the two literal "hyperwall_v8.exe" checks.
  • constants.pyLAUNCHER_EXEhyperwall.exe, NV_SENTINEL.hyperwall_nvprofile.sentinel.
  • Build/launchbuild.bat, build.ps1, bootstrap.ps1 (renamed from bootstrap_v8.ps1), and launch.bat all emit/launch hyperwall.exe.
  • hyperwall.nip⚠️ load-bearing: the NVIDIA profile matches on the exe basename, so it now targets hyperwall.exe. Without this, isolation wouldn't apply to the renamed binary.
  • Tests + CI — bumped the version assert and added test_08_no_versioned_exe_literals, which fails if any hyperwall_v<N> / hardcoded-HyperWall/<x.y> literal ever resurfaces. New .github/workflows/repo-guards.yml runs the guards on push + PR.
  • README / .gitignore / module docstrings updated.

Validation (Linux)

  • py_compile clean across all modules.
  • 8/8 repo guards pass (including the new drift guard — verified it actually catches a planted hyperwall_v8 literal).
  • Confirmed at runtime: __version__=10.0.0, VERSION_SHORT=10.0, LAUNCHER_EXE basename = hyperwall.exe.

⚠️ Still needs a Windows pass on skyhawk (not doable from Linux)

Per the project's own guardrail (don't assume a fix works from code inspection alone):

  1. build.bat → produces hyperwall.exe.
  2. Launch it and confirm the log shows G-Sync isolation enabled (not the "running as … not a bundled hyperwall*.exe" warning).
  3. Confirm the NVIDIA profile applies to hyperwall.exe in NPI.
  4. Smoke-test playback against the live Emby server (static=true path unchanged, but verify).

Milestone: v10 · Part of the roadmap in #5.

#6)

Single source of version truth and a versionless executable so future bumps
never again break G-Sync isolation (which is gated on the exe basename).

- __init__.py: __version__ = "10.0.0" + derived VERSION_SHORT (bump = 1 line)
- emby.py / wizard.py: User-Agent, Emby auth Version, window titles derive
  from VERSION_SHORT (no more hardcoded "9.0")
- nvidia.py: G-Sync isolation decoupled from literal "hyperwall_v8.exe" —
  now _is_isolated_launch() matches a "hyperwall*.exe" prefix or
  HYPERWALL_ISOLATED=1
- constants.py: LAUNCHER_EXE / NV_SENTINEL versionless
- build.bat / build.ps1 / bootstrap.ps1 (renamed from bootstrap_v8.ps1) /
  launch.bat: emit and launch "hyperwall.exe"
- hyperwall.nip: NVIDIA profile now targets hyperwall.exe (load-bearing —
  the profile matches on exe basename)
- tests: bump version assert; add test_08_no_versioned_exe_literals to fail
  CI if hyperwall_v<N> / hardcoded-version drift ever returns
- .github/workflows/repo-guards.yml: run guards on push + PR
- README / .gitignore / module docstrings updated

Validation: py_compile clean, 8/8 repo guards pass, VERSION_SHORT=10.0 and
exe basename resolve verified. PyInstaller build + live G-Sync check pending
on skyhawk (Windows).

Refs #6
@tcconnally tcconnally added this to the v10 milestone Jul 2, 2026
test_01 only skipped on a missing PyQt6; in a bare CI runner 'requests' was
the first missing module, so the guard re-raised and failed the build. Skip
gracefully on any of PyQt6/requests/flask/mpv (this is an import smoke test,
not a dependency check). Fixes the CI failure on the Epic 1 PR.
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.

Epic 1: Identity Unification (v8→v10 single source of truth)

2 participants