Skip to content

Latest commit

 

History

History
87 lines (79 loc) · 5.58 KB

development.md

File metadata and controls

87 lines (79 loc) · 5.58 KB

Development

Snipvoice source is 1.2.1 on the stable channel (the upcoming v1.2.1). Runtime dependencies and native voice dependencies remain in separate manifests. Use an existing interpreter; do not implicitly update host tooling or packages.

Run all tests from source with python -m unittest discover -s tests -v. Run focused correctness lint from root with python -m ruff check source. CI uses three consolidated lanes: Windows and macOS run the release Python 3.12 runtime, while Linux runs Python 3.14 plus focused Ruff checks. Every lane installs the pinned native voice dependencies, requires their imports, rejects skipped runtime/resampler tests, builds the applicable capture helper, and runs the complete suite. This preserves all supported operating-system and Python version boundaries without a Cartesian matrix.

Desktop bundle jobs remain the release proof, but run on pull requests only when packaging, native-helper, dependency, icon, installer, or workflow inputs change. They always run for version tags and manual dispatch. Pull-request bundle artifacts are not uploaded; tag/manual artifacts expire after 14 days and should be moved to a GitHub Release when they are intended for distribution. Branch protection should require only tests (ubuntu-latest, py3.14), tests (windows-latest, py3.12), and tests (macos-latest, py3.12); lint and native voice are enforced inside those jobs rather than as separate contexts.

Windows: build_release.bat, then build_installer.bat (Inno Setup 6 required). macOS: ./build_release_macos.sh, optionally with an existing PYTHON interpreter or CODESIGN_IDENTITY. Both builds stage first and probe the complete native runtime before promoting. Installer identity, shortcuts, mutex, bundle identifier, logs, user data, and default cache belong to Snipvoice independently of Sniptype. PyInstaller is pinned separately in requirements-build.txt; source-only installs do not need the packaging tool.

Local summaries and semantic retrieval use a custom, source-pinned llama.cpp wheel. requirements-voice.txt installs its Python dependencies but deliberately does not resolve an upstream llama.cpp wheel. Build/install the approved wheel using the runtime recipe. CI and desktop bundle jobs use that same recipe. Both packagers verify the source runtime's hashes and run a staged --embedding-runtime-probe before promotion; native license and build identity stay inside the package.

Live microphone-to-paste, cancellation, device-loss, final-word resampling, denied permissions, stale target, upgrade/uninstall, and macOS TCC/signing behavior need physical desktop proof. Hosted bundles are unsigned or ad-hoc signed and must not be represented as notarized or publisher-signed.

Offline meetings add owned Windows/macOS capture helpers built by source/native/build_windows_capture.bat and source/native/build_macos_capture.sh. Existing native toolchains are required; the package scripts compile/bundle these helpers and run the non-recording --meeting-capture-probe before promotion. The meeting workspace shares the existing GUI root and keeps new device/disk/inference work on workers. meeting_mixdown.py derives one bounded, atomic MP3 from the timestamped raw tracks after a normal stop; PCM16 WAV is an explicit export option. The bundled PyAV/LAME encoder streams the mix without a permanent WAV intermediate. It linearly adapts a lower native rate to the higher source clock and never rewrites the recoverable track segments. The optional microphone volume adjustment measures the raw track in bounded memory, then applies capped gain and a limiter only to the derived playback file. It preserves quiet speech instead of hard-gating it; do not describe it as spectral denoising or echo cancellation. Transcription continues to consume the original raw tracks, so MP3 compression does not alter model input. Existing final WAVs stay playable and are never automatically converted or removed. Raw storage remains available for recovery and retranscription under the existing retention policy. New recordings and imports automatically use installed transcription and summary models, sequentially under the existing local inference reservation. Unavailable models are skipped without downloads. The library opens full text by default, offers a timestamped presentation, and copies/exports the selected format without rerunning inference. Summaries are saved automatically and can be regenerated. Manual organization and filter controls are removed from the interface; stored organization metadata remains intact. See implementation validation and open hardware gates.

Local meeting-memory development uses the canonical-bundle/disposable-index boundary described in local-meeting-memory-operations.md. Run storage, index, report, annotation, clip, and retention tests only against copied fixtures under source/tests/tmp; never point them at a live SNIPVOICE_HOME. Deleting library.sqlite* is an index-rebuild test, not a data-deletion test. The SQLite/FTS runtime probe, repair/rebuild UI, report and Q&A controls, consent settings, retention preview, trash, restore, and purge routes are implemented. On 2026-09-17, python -m unittest discover -s tests -q ran 1,195 tests successfully with 53 environment/platform skips. Ruff is unavailable in this validation context and must not be described as passed until it is run with the pinned development tool. Physical Tk/tray interaction, native capture, packaged startup, and signing remain separate acceptance work.