From 698cd048e7b153f2d9353879669e2c73a922f933 Mon Sep 17 00:00:00 2001 From: emeisazam <255706292+emeisazam@users.noreply.github.com> Date: Sun, 2 Aug 2026 20:32:50 -0500 Subject: [PATCH] Release GERM 0.3.2 status privacy patch --- CHANGELOG.md | 7 +++++++ CITATION.cff | 2 +- README.md | 2 +- apps/macos/script/build_and_run.sh | 4 ++-- pyproject.toml | 2 +- server/cosmoaudition.py | 5 ++++- server/identity.py | 2 +- tests/test_project_consistency.py | 12 ++++++------ tests/test_server.py | 23 +++++++++++++++++++++++ uv.lock | 2 +- 10 files changed, 47 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec5980a..b25e3ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## 0.3.2 — Cosmoaudition status privacy + +- Keep Cosmoaudition health-check failures in local logs while returning only + a stable public error at the loopback API boundary. +- Add a regression test proving low-level backend details cannot enter the + status payload. + ## 0.3.1 — Security and stack alignment - Overrode Stable Audio 3's upstream Torch 2.7.1 constraint with the locally diff --git a/CITATION.cff b/CITATION.cff index 6d48c8b..7c4582e 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -5,7 +5,7 @@ authors: - family-names: "Isaza" given-names: "eme" affiliation: "Sonic Field Labs" -version: "0.3.1" +version: "0.3.2" date-released: "2026-08-03" license: "MPL-2.0" repository-code: "https://github.com/sonicfieldlabs/germ" diff --git a/README.md b/README.md index f87e3b3..7c50319 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ listened to, and traced through lineage. A listening from Oída can become a prompt or source in GERM; a successful render can become a descendant in Akousmata and return to Oída for another listening. -Current release: `0.3.1`. +Current release: `0.3.2`. GERM is an independent Sonic Field Labs project. It can use Stable Audio 3 providers, but it is not an official Stability AI product. diff --git a/apps/macos/script/build_and_run.sh b/apps/macos/script/build_and_run.sh index 79992e7..2852511 100755 --- a/apps/macos/script/build_and_run.sh +++ b/apps/macos/script/build_and_run.sh @@ -6,8 +6,8 @@ APP_NAME="germ" EXECUTABLE_NAME="germ-macos" BUNDLE_ID="org.sonicfield.germ" MIN_SYSTEM_VERSION="13.0" -MARKETING_VERSION="0.3.1" -BUNDLE_VERSION="4" +MARKETING_VERSION="0.3.2" +BUNDLE_VERSION="5" ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" # Keep the runnable bundle where repository users expect to find apps. The diff --git a/pyproject.toml b/pyproject.toml index 6e40a48..b8a546f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "germ" -version = "0.3.1" +version = "0.3.2" description = "Local-first modular laboratory for generative microsound, Stable Audio workflows, and lineage-aware cultivation." readme = "README.md" license = "MPL-2.0" diff --git a/server/cosmoaudition.py b/server/cosmoaudition.py index 7e98e95..2e44ad5 100644 --- a/server/cosmoaudition.py +++ b/server/cosmoaudition.py @@ -1,6 +1,7 @@ from __future__ import annotations import json +import logging import math from ipaddress import ip_address from typing import Any @@ -19,6 +20,7 @@ COSMOAUDITION_GERM_CONTRACT = "cosmoaudition-germ/v0.1" COSMOAUDITION_REMOTE_PATHS = frozenset({"/health", "/api/sources", "/api/snapshot"}) +LOGGER = logging.getLogger(__name__) class CosmoauditionBridgeError(RuntimeError): @@ -129,11 +131,12 @@ def status(self) -> dict[str, Any]: try: remote = self.get_json("/health") except (CosmoauditionBridgeError, ValueError) as exc: + LOGGER.warning("Cosmoaudition health check unavailable: %s", exc) return { "available": False, "contract": COSMOAUDITION_GERM_CONTRACT, "baseUrl": self.base_url, - "error": str(exc)[:2_000], + "error": "Cosmoaudition bridge unavailable", } return { "available": remote.get("ok", True) is True, diff --git a/server/identity.py b/server/identity.py index 07b82a0..485c517 100644 --- a/server/identity.py +++ b/server/identity.py @@ -3,7 +3,7 @@ PRODUCT_NAME = "germ" PRODUCT_DESCRIPTION = "open-source modular lab for generative microsound" -__version__ = "0.3.1" +__version__ = "0.3.2" LEGACY_ENGINE_NAME = "Germinator" SOUND_MATTER_CONCEPT = "sound_matter" SOUND_MATTER_SCALES = ["micro", "meso", "macro"] diff --git a/tests/test_project_consistency.py b/tests/test_project_consistency.py index 914c5fc..68bf039 100644 --- a/tests/test_project_consistency.py +++ b/tests/test_project_consistency.py @@ -50,10 +50,10 @@ def test_stable_audio_uses_the_audited_torch_override() -> None: def test_release_version_is_consistent_across_runtime_and_packaging() -> None: - assert __version__ == "0.3.1" - assert 'version = "0.3.1"' in _read("pyproject.toml") - assert 'Current release: `0.3.1`.' in _read("README.md") - assert 'version: "0.3.1"' in _read("CITATION.cff") + assert __version__ == "0.3.2" + assert 'version = "0.3.2"' in _read("pyproject.toml") + assert 'Current release: `0.3.2`.' in _read("README.md") + assert 'version: "0.3.2"' in _read("CITATION.cff") assert 'date-released: "2026-08-03"' in _read("CITATION.cff") - assert 'MARKETING_VERSION="0.3.1"' in _read("apps/macos/script/build_and_run.sh") - assert 'BUNDLE_VERSION="4"' in _read("apps/macos/script/build_and_run.sh") + assert 'MARKETING_VERSION="0.3.2"' in _read("apps/macos/script/build_and_run.sh") + assert 'BUNDLE_VERSION="5"' in _read("apps/macos/script/build_and_run.sh") diff --git a/tests/test_server.py b/tests/test_server.py index e3a6ea0..70fa59d 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -986,6 +986,29 @@ def test_cosmoaudition_status_requires_boolean_remote_health( assert bridge.status()["available"] is False +def test_cosmoaudition_status_logs_but_does_not_return_backend_details( + monkeypatch: pytest.MonkeyPatch, + caplog: pytest.LogCaptureFixture, +) -> None: + bridge = CosmoauditionBridge( + base_url="http://127.0.0.1:8797", + timeout_seconds=0.1, + max_response_bytes=1_024, + ) + + def fail(_path: str) -> dict: + raise CosmoauditionBridgeError("private backend path: /Users/listener/secret") + + monkeypatch.setattr(bridge, "get_json", fail) + with caplog.at_level("WARNING"): + status = bridge.status() + + assert status["available"] is False + assert status["error"] == "Cosmoaudition bridge unavailable" + assert "secret" not in str(status) + assert "private backend path" in caplog.text + + def test_matter_analysis_persists_explicit_states_and_masa_sidecar() -> None: source_path = settings.audio_dir / "pytest_matter_analysis_source.wav" write_sine_wav(source_path, duration=0.25) diff --git a/uv.lock b/uv.lock index 9107f90..e2caace 100644 --- a/uv.lock +++ b/uv.lock @@ -283,7 +283,7 @@ wheels = [ [[package]] name = "germ" -version = "0.3.1" +version = "0.3.2" source = { virtual = "." } dependencies = [ { name = "akousma" },