Skip to content

Add surfer + cicwave waveform viewers; gate optional out of bulk groups#2

Merged
smprather merged 1 commit into
mainfrom
add-surfer-cicwave-waveform-tools
Jun 28, 2026
Merged

Add surfer + cicwave waveform viewers; gate optional out of bulk groups#2
smprather merged 1 commit into
mainfrom
add-surfer-cicwave-waveform-tools

Conversation

@smprather

Copy link
Copy Markdown
Owner

Three related additions plus a resolver tightening. Shared files (packages.json, regenerated bash completion, CLAUDE.md, HANDOFF, ADDING_BINARIES) carry all three intermixed, so this is one atomic commit to keep every intermediate state valid.

surfer 0.7.0 (gitlab.com/surfer-project/surfer)

  • Rust egui/glow (OpenGL) waveform viewer, built from the v0.7.0 tag on EL8 (native glibc-2.28; release profile has no -march=native).
  • Packaged gvim-style: bin/surfer.bz2 (wrapper with the wezterm Mesa/GLVND env block) + bin/surfer.bin.bz2 (stripped ELF, RPATH $ORIGIN/../lib64).
  • kind: bin, optional, depends: [gui_libs, mesa3d_libs]. The ELF NEEDs only glibc + libgcc_s; winit/glow dlopen libGL/X11/wayland/xkbcommon.
  • build-surfer.sh: tag-enforced, --recurse-submodules (v0.7.0 vendors f128 + instruction-decoder as submodules), fresh CARGO_HOME (bypasses the loadout's offline crate-store), strip+patchelf+wrapper. farm-versions entry added.

Resolver: all / @shared skip optional: true

  • The synthetic all sweep (and @shared, which builds on it) now exclude optional packages. So surfer is name-only — in no bulk group, installable via ./loadout install surfer.
  • Intended side effect: the @rust trio (rust, rust-crate-store, env-cargo, all optional) likewise drops from @engineering-loadout / @shared; still reachable via @rust. Nothing depends on rust, so no fallout. The release smoke (test-prebuilt-binaries installs @shared) no longer drags rust.
  • Purged stale default: true / "default set" references from ADDING_BINARIES (cloc/scc/tokei + the new-binary template); the registry has 0 default flags and the resolver never read the field — optional is the only gating field.

cicwave 0.5.2 (github.com/wulffern/cicwave) — loadout PyQt6 fork

  • PyQtGraph waveform viewer (ngspice/Xyce/VCD/CSV). Upstream imports PySide6, which has no wheel that is both EL8 (glibc 2.28) and Python 3.14: 6.9.x is manylinux_2_28 but python<3.14; 6.10+ added 3.14 and simultaneously raised the linux floor to manylinux_2_34 (glibc 2.34/RHEL9; QtCore.abi3.so floor GLIBC_2.34, verified) — a one-way ratchet. PyQt6 satisfies both (PyQt6-Qt6 6.9.2 manylinux_2_28, libQt6Core floor GLIBC_2.28; binding abi3 cp39; sip cp314), so we carry a small fork.
  • 0001-port-pyside6-to-pyqt6.patch (wave_pg.py + pyproject, 56 ± lines): PySide6→PyQt6 imports, pyqtSignal as Signal, 25 strict-enum scopings (Qt.AlignCenterQt.AlignmentFlag.AlignCenter, …), two dynamic getattr(QPalette.ColorRole, …) / ShortcutContext fixes, and the pyproject PySide6PyQt6 dependency (else the built wheel can't resolve offline).
  • build-cicwave.sh clones the stable tag, applies the patch, uv builds the wheel, downloads the PyQt6 + matplotlib closure as EL8/cp314 wheels, and splits the ~79 MB pyqt6_qt6 wheel into .whl.part-NNN (installer _prepare_wheels_dir rejoins it, like polars/pyarrow). numpy/pandas/click/pyyaml/packaging/python_dateutil/six reused from the existing bundle.
  • kind: python-tool, uv_tool: cicwave, optional, depends: [portable-python, uv].

time-plot

  • Rolling-git wheel rebuilt 2a1c0774e94f23 (./update time-plot).

Verification (on this EL8 box)

  • surfer: built from v0.7.0 tag, glibc floor 2.28, ldd host-only, surfer 0.7.0 (git: v0.7.0); ./loadout install surfer --no-deps --dest-dir then installed wrapper ran --version; resolver assertions (surfer + @rust absent from all/@shared/@engineering-loadout, reachable by name / via @rust); doctor exit 0.
  • cicwave: patch applies clean on fresh 0.5.2 clone; offline uv tool install reuses existing numpy/pandas; full ./loadout install cicwave --dest-dir (portable Python + Qt-wheel rejoin + uv tool install) then a headless QT_QPA_PLATFORM=offscreen CICSIM_USE_OPENGL=0 render (window + 3 plotted waves + matplotlib PNG export, no enum errors). Not smoked on a real X/WSLg display — interactive-only enum paths (drag/drop, context menus, key modifiers) are statically scoped but unexercised headlessly.
  • Static gates: py_compile, json.tool packages.json, sh -n loadout, bash -n (build scripts, completion, bashrc), git diff --check.

🤖 Generated with Claude Code

Three related additions plus a resolver tightening. Shared files
(packages.json, regenerated bash completion, CLAUDE.md, HANDOFF,
ADDING_BINARIES) carry all three intermixed, so this is one atomic commit
to keep every intermediate state valid.

surfer 0.7.0 (gitlab.com/surfer-project/surfer)
- Rust egui/glow (OpenGL) waveform viewer, built from the v0.7.0 tag on EL8
  (native glibc-2.28; release profile has no -march=native).
- Packaged gvim-style: bin/surfer.bz2 (wrapper with the wezterm Mesa/GLVND
  env block) + bin/surfer.bin.bz2 (stripped ELF, RPATH $ORIGIN/../lib64).
- packages.json kind: bin, optional, depends [gui_libs, mesa3d_libs]. The ELF
  NEEDs only glibc + libgcc_s; winit/glow dlopen libGL/X11/wayland/xkbcommon.
- build-surfer.sh: tag-enforced, --recurse-submodules (v0.7.0 vendors f128 +
  instruction-decoder as submodules), fresh CARGO_HOME (bypasses the loadout's
  offline crate-store), strip+patchelf+wrapper. farm-versions entry added.

Resolver: all / @shared skip optional: true (loadout_main.py expand_groups)
- The synthetic `all` sweep (and @shared, which builds on it) now exclude
  packages flagged optional. So surfer is name-only -- in no bulk group,
  installable via `./loadout install surfer`.
- Intended side effect: the @rust trio (rust, rust-crate-store, env-cargo, all
  optional) likewise drops from @engineering-loadout / @shared; still reachable
  via @rust. Nothing depends on rust, so no fallout. The release smoke
  (test-prebuilt-binaries installs @shared) no longer drags rust.
- Purged stale `default: true` / "default set" references from ADDING_BINARIES
  (cloc/scc/tokei + the new-binary template); the registry has 0 default flags
  and the resolver never read the field -- optional is the only gating field.

cicwave 0.5.2 (github.com/wulffern/cicwave) -- loadout PyQt6 fork
- PyQtGraph waveform viewer (ngspice/Xyce/VCD/CSV). Upstream imports PySide6,
  which has no wheel that is both EL8 (glibc 2.28) and Python 3.14: 6.9.x is
  manylinux_2_28 but python<3.14; 6.10+ added 3.14 and simultaneously raised the
  linux floor to manylinux_2_34 (glibc 2.34/RHEL9; QtCore.abi3.so floor
  GLIBC_2.34, verified) -- a one-way ratchet. PyQt6 satisfies both (PyQt6-Qt6
  6.9.2 manylinux_2_28, libQt6Core floor GLIBC_2.28; binding abi3 cp39; sip
  cp314), so we carry a small fork.
- 0001-port-pyside6-to-pyqt6.patch (wave_pg.py + pyproject, 56 +/- lines):
  PySide6->PyQt6 imports, pyqtSignal as Signal, 25 strict-enum scopings
  (Qt.AlignCenter -> Qt.AlignmentFlag.AlignCenter, ...), two dynamic
  getattr(QPalette.ColorRole, ...) / ShortcutContext fixes, and the pyproject
  PySide6 -> PyQt6 dependency (else the built wheel can't resolve offline).
- build-cicwave.sh clones the stable tag, applies the patch, uv builds the
  wheel, downloads the PyQt6 + matplotlib closure as EL8/cp314 wheels, and
  splits the ~79 MB pyqt6_qt6 wheel into .whl.part-NNN (installer
  _prepare_wheels_dir rejoins it, like polars/pyarrow). numpy/pandas/click/
  pyyaml/packaging/python_dateutil/six reused from the existing bundle.
- packages.json kind: python-tool, uv_tool: cicwave, optional, depends
  [portable-python, uv]. Verified end-to-end on EL8: full
  `./loadout install cicwave --dest-dir` (portable Python + rejoin + offline
  uv tool install) then a headless QT_QPA_PLATFORM=offscreen render (window +
  3 plotted waves + matplotlib PNG export, no enum errors). Not yet smoked on a
  real X/WSLg display -- interactive-only enum paths are statically scoped but
  unexercised headlessly.

time-plot: rolling-git wheel rebuilt 2a1c077 -> 4e94f23 (./update time-plot).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@smprather
smprather merged commit 924e4f0 into main Jun 28, 2026
1 check passed
@smprather
smprather deleted the add-surfer-cicwave-waveform-tools branch June 28, 2026 19:12
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