From c555986db4ecb17c13306af6facf3dd3d3394689 Mon Sep 17 00:00:00 2001 From: etserend Date: Thu, 30 Jul 2026 13:16:48 -0500 Subject: [PATCH 1/7] =?UTF-8?q?fix(config):=20rename=20config=20file=20gal?= =?UTF-8?q?ileo-python-config.json=20=E2=86=92=20splunk-ao-config.json=20(?= =?UTF-8?q?HYBIM-918)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- CHANGELOG.md | 11 +++++++++++ splunk-ao-migration-tool/README.md | 12 +++++++++++- src/splunk_ao/config.py | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8335195..55f5adfc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.1.0] - 2026-07-31 +### Breaking Changes + +- **Config file renamed** (HYBIM-918): The on-disk credentials file written to + `~/.galileo/` has been renamed from `galileo-python-config.json` to + `splunk-ao-config.json`. Users with an existing saved config must either rename + the file manually or delete it and re-authenticate. + +- `SplunkAOLogger.flush()` and `async_flush()` now return `None` and only drain + completed spans already queued for OTLP export. They no longer conclude open + spans or return uploaded proprietary trace objects. + ### Added - Added deployment-aware configuration and authentication for Splunk diff --git a/splunk-ao-migration-tool/README.md b/splunk-ao-migration-tool/README.md index c972e237..f900a54a 100644 --- a/splunk-ao-migration-tool/README.md +++ b/splunk-ao-migration-tool/README.md @@ -340,6 +340,16 @@ The `GalileoScorers` enum has been removed entirely. Migrate to `SplunkAOEvaluat + scorer = SplunkAOEvaluators.completeness ``` +### 5.3 On-Disk Config File Renamed + +The SDK credentials file written to `~/.galileo/` has been renamed: + +| Old | New | +|-----|-----| +| `~/.galileo/galileo-python-config.json` | `~/.galileo/splunk-ao-config.json` | + +If you have saved credentials on disk, either rename the file manually or delete it and re-authenticate by running your code once. + --- ## 6. HTTP Tracing Headers @@ -422,13 +432,13 @@ The following are **unchanged** between galileo and splunk-ao and require no mig - Optional extra names (`[langchain]`, `[openai]`, `[otel]`, `[all]`, etc.) - `TracingMiddleware` class name - `OPENAI_API_KEY` environment variable -- On-disk config file name: `galileo-python-config.json` - Default console/API URLs (`https://app.galileo.ai/`, `https://api.galileo.ai/`) --- ## 9. Migration Checklist +- [ ] Rename on-disk config file: `~/.galileo/galileo-python-config.json` → `~/.galileo/splunk-ao-config.json` (or delete it and re-authenticate) - [ ] Update Python to **≥ 3.11** - [ ] Replace `galileo` with `splunk-ao` in `requirements.txt` / `pyproject.toml` - [ ] Add `grpcio>=1.80.0,<2.0.0` if using the `otel` extra (or use `splunk-ao[otel]`) diff --git a/src/splunk_ao/config.py b/src/splunk_ao/config.py index 58cf3917..bf002819 100644 --- a/src/splunk_ao/config.py +++ b/src/splunk_ao/config.py @@ -71,7 +71,7 @@ class SplunkAOConfig(GalileoConfig): """Configure authentication and endpoints for standalone and O11y deployments.""" # Config file for this project. - config_filename: str = "galileo-python-config.json" + config_filename: str = "splunk-ao-config.json" console_url: Url = DEFAULT_CONSOLE_URL _instance: ClassVar[Optional["SplunkAOConfig"]] = None From 57596573f4627b6f25fd1920ee0455d1564d7950 Mon Sep 17 00:00:00 2001 From: etserend Date: Thu, 30 Jul 2026 16:32:16 -0500 Subject: [PATCH 2/7] test(config): assert SplunkAOConfig.config_filename defaults to splunk-ao-config.json (HYBIM-918) Co-Authored-By: Claude Opus 4.7 --- tests/test_config.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_config.py b/tests/test_config.py index ce2407ab..f8920ec7 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -336,3 +336,7 @@ def test_reset_removes_all_bridgeable_galileo_vars() -> None: f"reset() is expected to remove {galileo_key} " f"(bridge owns all GALILEO_* keys; no SDK consumer sets them directly)" ) + + +def test_config_filename_default() -> None: + assert SplunkAOConfig.model_fields["config_filename"].default == "splunk-ao-config.json" From 665ab908c66d8cac37f9d8e9545e0ec4198b24aa Mon Sep 17 00:00:00 2001 From: etserend Date: Sat, 1 Aug 2026 10:43:05 -0500 Subject: [PATCH 3/7] fix(changelog): remove out-of-scope flush() entry from HYBIM-918 CHANGELOG hunk Co-Authored-By: Claude Opus 4.7 --- CHANGELOG.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55f5adfc..60a09a45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,10 +30,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 `splunk-ao-config.json`. Users with an existing saved config must either rename the file manually or delete it and re-authenticate. -- `SplunkAOLogger.flush()` and `async_flush()` now return `None` and only drain - completed spans already queued for OTLP export. They no longer conclude open - spans or return uploaded proprietary trace objects. - ### Added - Added deployment-aware configuration and authentication for Splunk From 3240180f3aa89685bec0f30b7ce5fd8c4096957e Mon Sep 17 00:00:00 2001 From: etserend Date: Wed, 5 Aug 2026 10:31:02 -0500 Subject: [PATCH 4/7] fix(config): address review comments, add runtime test, drop Jira id (HYBIM-918) Co-Authored-By: Claude Opus 4.7 --- CHANGELOG.md | 13 +++++++----- splunk-ao-migration-tool/README.md | 12 +++++------ tests/test_config.py | 32 ++++++++++++++++++++---------- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60a09a45..3a01e50a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,12 +23,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.1.0] - 2026-07-31 -### Breaking Changes +### Changed -- **Config file renamed** (HYBIM-918): The on-disk credentials file written to - `~/.galileo/` has been renamed from `galileo-python-config.json` to - `splunk-ao-config.json`. Users with an existing saved config must either rename - the file manually or delete it and re-authenticate. +- **Config file**: The SDK credentials file is `~/.galileo/splunk-ao-config.json`. + The directory `~/.galileo/` is inherited from `galileo-core` and unchanged. + Users migrating from `galileo-python` with an existing `~/.galileo/galileo-python-config.json` + must delete the old file and re-authenticate. +- **`monitor_progress()` `job_id` parameter removed** (HYBIM-931): The deprecated + `job_id` keyword argument of `Experiment.monitor_progress()` has been fully removed. + Callers passing `job_id=` must remove that argument. ### Added diff --git a/splunk-ao-migration-tool/README.md b/splunk-ao-migration-tool/README.md index f900a54a..6fcf1dc0 100644 --- a/splunk-ao-migration-tool/README.md +++ b/splunk-ao-migration-tool/README.md @@ -340,15 +340,13 @@ The `GalileoScorers` enum has been removed entirely. Migrate to `SplunkAOEvaluat + scorer = SplunkAOEvaluators.completeness ``` -### 5.3 On-Disk Config File Renamed +### 5.3 On-Disk Config File -The SDK credentials file written to `~/.galileo/` has been renamed: +`splunk-ao-python` writes credentials to `~/.galileo/splunk-ao-config.json`. +The directory `~/.galileo/` is inherited from `galileo-core` and unchanged. -| Old | New | -|-----|-----| -| `~/.galileo/galileo-python-config.json` | `~/.galileo/splunk-ao-config.json` | - -If you have saved credentials on disk, either rename the file manually or delete it and re-authenticate by running your code once. +If you have an existing `~/.galileo/galileo-python-config.json` from `galileo-python`, +delete it and re-authenticate — the SDK will create the new file automatically. --- diff --git a/tests/test_config.py b/tests/test_config.py index f8920ec7..98e5d2c4 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,4 +1,5 @@ import os +from pathlib import Path from unittest.mock import MagicMock, patch import pytest @@ -81,9 +82,7 @@ def test_bridge_env_vars_propagates_splunk_ao_to_galileo(splunk_key, galileo_key with patch.dict(os.environ, {splunk_key: value}, clear=False): os.environ.pop(galileo_key, None) SplunkAOConfig._bridge_env_vars() - assert os.environ.get(galileo_key) == value, ( - f"Expected {galileo_key}={value!r} after bridging {splunk_key}" - ) + assert os.environ.get(galileo_key) == value, f"Expected {galileo_key}={value!r} after bridging {splunk_key}" @pytest.mark.parametrize("splunk_key,galileo_key", _CANONICAL_BRIDGE_PAIRS) @@ -107,9 +106,7 @@ def test_bridge_env_vars_skips_absent_splunk_ao_keys() -> None: with patch.dict(os.environ, clean_env, clear=True): SplunkAOConfig._bridge_env_vars() for _, galileo_key in _ALL_BRIDGE_PAIRS: - assert galileo_key not in os.environ, ( - f"{galileo_key} must not be set when its SPLUNK_AO_* source is absent" - ) + assert galileo_key not in os.environ, f"{galileo_key} must not be set when its SPLUNK_AO_* source is absent" # --------------------------------------------------------------------------- @@ -271,8 +268,7 @@ def test_reset_clears_bridged_galileo_env_vars() -> None: for galileo_key in galileo_keys: assert galileo_key not in os.environ, ( - f"reset() must remove {galileo_key} from os.environ; " - f"found stale value '{os.environ.get(galileo_key)}'" + f"reset() must remove {galileo_key} from os.environ; found stale value '{os.environ.get(galileo_key)}'" ) @@ -306,8 +302,7 @@ def test_bridge_picks_up_new_credential_after_reset(monkeypatch) -> None: # Second bridge — must pick up the new key now that reset() cleared the old one. SplunkAOConfig._bridge_env_vars() assert os.environ.get("GALILEO_API_KEY") == "key-rotated", ( - "After reset() + credential rotation, bridge must copy the new key; " - "got stale value instead" + "After reset() + credential rotation, bridge must copy the new key; got stale value instead" ) # Cleanup: monkeypatch will restore SPLUNK_AO_API_KEY, but the bridge wrote # GALILEO_API_KEY directly to os.environ — remove it so it doesn't leak. @@ -340,3 +335,20 @@ def test_reset_removes_all_bridgeable_galileo_vars() -> None: def test_config_filename_default() -> None: assert SplunkAOConfig.model_fields["config_filename"].default == "splunk-ao-config.json" + + +def test_config_file_path_resolves_to_splunk_ao_config() -> None: + """An instantiated config resolves its on-disk path to splunk-ao-config.json. + + Complements test_config_filename_default (which only checks the declared + field default) by exercising the runtime `config_file` property that + galileo-core actually reads from and writes to on disk. model_construct + applies field defaults while skipping the network-calling validators that a + full SplunkAOConfig(...) instantiation would trigger. + """ + home_dir = Path("/tmp/splunk-ao-config-test") + config = SplunkAOConfig.model_construct(home_dir=home_dir) + + assert config.config_filename == "splunk-ao-config.json" + assert config.config_file == home_dir / "splunk-ao-config.json" + assert config.config_file.name == "splunk-ao-config.json" From 8452216f024dd48dc0e04fbc21d0fb55594a2066 Mon Sep 17 00:00:00 2001 From: etserend Date: Thu, 6 Aug 2026 12:39:03 -0500 Subject: [PATCH 5/7] fix(changelog): move config-file rename entry to [Unreleased] (HYBIM-918) Co-Authored-By: Claude Opus 4.7 --- CHANGELOG.md | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a01e50a..04b0faa8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 and complete `agent_control.*` field set required for backend classification and Controls-card rendering. +### Changed + +- **Config file renamed** (HYBIM-918): The on-disk credentials file written to + `~/.galileo/` has been renamed from `galileo-python-config.json` to + `splunk-ao-config.json`. Users with an existing `~/.galileo/galileo-python-config.json` + must delete the old file and re-authenticate. + ## [0.1.1] - 2026-08-03 ### Removed @@ -23,16 +30,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.1.0] - 2026-07-31 -### Changed - -- **Config file**: The SDK credentials file is `~/.galileo/splunk-ao-config.json`. - The directory `~/.galileo/` is inherited from `galileo-core` and unchanged. - Users migrating from `galileo-python` with an existing `~/.galileo/galileo-python-config.json` - must delete the old file and re-authenticate. -- **`monitor_progress()` `job_id` parameter removed** (HYBIM-931): The deprecated - `job_id` keyword argument of `Experiment.monitor_progress()` has been fully removed. - Callers passing `job_id=` must remove that argument. - ### Added - Added deployment-aware configuration and authentication for Splunk From d5df82a7d3bfdd878b165a999826712f98d5eb37 Mon Sep 17 00:00:00 2001 From: etserend Date: Thu, 6 Aug 2026 12:50:11 -0500 Subject: [PATCH 6/7] fix(config): address reviewer feedback on tests and migration docs (HYBIM-918) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - README §9 checklist: replace "rename" with delete-and-re-authenticate to match §5.3 and CHANGELOG wording - test_config_file_path_resolves_to_splunk_ao_config: use tmp_path fixture, drop duplicate config_filename assertion and redundant .name assertion - Revert four formatting-churn hunks in test_config.py (assert messages restored to multi-line form matching main) Co-Authored-By: Claude Opus 4.7 --- splunk-ao-migration-tool/README.md | 2 +- tests/test_config.py | 35 +++++++++++++++--------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/splunk-ao-migration-tool/README.md b/splunk-ao-migration-tool/README.md index 6fcf1dc0..fb7a4730 100644 --- a/splunk-ao-migration-tool/README.md +++ b/splunk-ao-migration-tool/README.md @@ -436,7 +436,7 @@ The following are **unchanged** between galileo and splunk-ao and require no mig ## 9. Migration Checklist -- [ ] Rename on-disk config file: `~/.galileo/galileo-python-config.json` → `~/.galileo/splunk-ao-config.json` (or delete it and re-authenticate) +- [ ] Delete the old on-disk config file `~/.galileo/galileo-python-config.json` and re-authenticate (the SDK creates `~/.galileo/splunk-ao-config.json` automatically) - [ ] Update Python to **≥ 3.11** - [ ] Replace `galileo` with `splunk-ao` in `requirements.txt` / `pyproject.toml` - [ ] Add `grpcio>=1.80.0,<2.0.0` if using the `otel` extra (or use `splunk-ao[otel]`) diff --git a/tests/test_config.py b/tests/test_config.py index 98e5d2c4..d9369a71 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,5 +1,4 @@ import os -from pathlib import Path from unittest.mock import MagicMock, patch import pytest @@ -82,7 +81,9 @@ def test_bridge_env_vars_propagates_splunk_ao_to_galileo(splunk_key, galileo_key with patch.dict(os.environ, {splunk_key: value}, clear=False): os.environ.pop(galileo_key, None) SplunkAOConfig._bridge_env_vars() - assert os.environ.get(galileo_key) == value, f"Expected {galileo_key}={value!r} after bridging {splunk_key}" + assert os.environ.get(galileo_key) == value, ( + f"Expected {galileo_key}={value!r} after bridging {splunk_key}" + ) @pytest.mark.parametrize("splunk_key,galileo_key", _CANONICAL_BRIDGE_PAIRS) @@ -106,7 +107,9 @@ def test_bridge_env_vars_skips_absent_splunk_ao_keys() -> None: with patch.dict(os.environ, clean_env, clear=True): SplunkAOConfig._bridge_env_vars() for _, galileo_key in _ALL_BRIDGE_PAIRS: - assert galileo_key not in os.environ, f"{galileo_key} must not be set when its SPLUNK_AO_* source is absent" + assert galileo_key not in os.environ, ( + f"{galileo_key} must not be set when its SPLUNK_AO_* source is absent" + ) # --------------------------------------------------------------------------- @@ -268,7 +271,8 @@ def test_reset_clears_bridged_galileo_env_vars() -> None: for galileo_key in galileo_keys: assert galileo_key not in os.environ, ( - f"reset() must remove {galileo_key} from os.environ; found stale value '{os.environ.get(galileo_key)}'" + f"reset() must remove {galileo_key} from os.environ; " + f"found stale value '{os.environ.get(galileo_key)}'" ) @@ -302,7 +306,8 @@ def test_bridge_picks_up_new_credential_after_reset(monkeypatch) -> None: # Second bridge — must pick up the new key now that reset() cleared the old one. SplunkAOConfig._bridge_env_vars() assert os.environ.get("GALILEO_API_KEY") == "key-rotated", ( - "After reset() + credential rotation, bridge must copy the new key; got stale value instead" + "After reset() + credential rotation, bridge must copy the new key; " + "got stale value instead" ) # Cleanup: monkeypatch will restore SPLUNK_AO_API_KEY, but the bridge wrote # GALILEO_API_KEY directly to os.environ — remove it so it doesn't leak. @@ -337,18 +342,14 @@ def test_config_filename_default() -> None: assert SplunkAOConfig.model_fields["config_filename"].default == "splunk-ao-config.json" -def test_config_file_path_resolves_to_splunk_ao_config() -> None: - """An instantiated config resolves its on-disk path to splunk-ao-config.json. +def test_config_file_path_resolves_to_splunk_ao_config(tmp_path) -> None: + """Runtime config_file property resolves to splunk-ao-config.json under home_dir. - Complements test_config_filename_default (which only checks the declared - field default) by exercising the runtime `config_file` property that - galileo-core actually reads from and writes to on disk. model_construct - applies field defaults while skipping the network-calling validators that a - full SplunkAOConfig(...) instantiation would trigger. + Complements test_config_filename_default by exercising the upstream + config_file property rather than just the declared field default. + model_construct skips network-calling validators while still applying + field defaults. """ - home_dir = Path("/tmp/splunk-ao-config-test") - config = SplunkAOConfig.model_construct(home_dir=home_dir) + config = SplunkAOConfig.model_construct(home_dir=tmp_path) - assert config.config_filename == "splunk-ao-config.json" - assert config.config_file == home_dir / "splunk-ao-config.json" - assert config.config_file.name == "splunk-ao-config.json" + assert config.config_file == tmp_path / "splunk-ao-config.json" From b8fb18ac727968b6ffdecaf9cee02d6d9b46b71d Mon Sep 17 00:00:00 2001 From: etserend Date: Thu, 6 Aug 2026 14:11:53 -0500 Subject: [PATCH 7/7] docs(config): fix incorrect claims in CHANGELOG and migration README (HYBIM-918) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The config file is a non-secret debug snapshot, not a credentials file. Nothing reads it back, so no migration step or re-authentication is needed. Remove the breaking-change framing and the §9 checklist item accordingly. Co-Authored-By: Claude Opus 4.7 --- CHANGELOG.md | 8 ++++---- splunk-ao-migration-tool/README.md | 11 ++++++----- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04b0faa8..b43a9e52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,10 +15,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- **Config file renamed** (HYBIM-918): The on-disk credentials file written to - `~/.galileo/` has been renamed from `galileo-python-config.json` to - `splunk-ao-config.json`. Users with an existing `~/.galileo/galileo-python-config.json` - must delete the old file and re-authenticate. +- **Config file renamed** (HYBIM-918): The non-secret debug snapshot written to + `~/.galileo/` on logout/reset is now named `splunk-ao-config.json` (was + `galileo-python-config.json`). The old file can be deleted or ignored — it is + never read back and has no effect on authentication or config resolution. ## [0.1.1] - 2026-08-03 diff --git a/splunk-ao-migration-tool/README.md b/splunk-ao-migration-tool/README.md index fb7a4730..250c0f95 100644 --- a/splunk-ao-migration-tool/README.md +++ b/splunk-ao-migration-tool/README.md @@ -342,11 +342,13 @@ The `GalileoScorers` enum has been removed entirely. Migrate to `SplunkAOEvaluat ### 5.3 On-Disk Config File -`splunk-ao-python` writes credentials to `~/.galileo/splunk-ao-config.json`. -The directory `~/.galileo/` is inherited from `galileo-core` and unchanged. +On logout or reset, `splunk-ao-python` writes a non-secret debug snapshot to +`~/.galileo/splunk-ao-config.json`. The directory `~/.galileo/` is inherited +from `galileo-core` and unchanged. -If you have an existing `~/.galileo/galileo-python-config.json` from `galileo-python`, -delete it and re-authenticate — the SDK will create the new file automatically. +This file is never read back and has no effect on authentication or config +resolution. If you have an existing `~/.galileo/galileo-python-config.json` +from `galileo-python`, it can be deleted at leisure or simply ignored. --- @@ -436,7 +438,6 @@ The following are **unchanged** between galileo and splunk-ao and require no mig ## 9. Migration Checklist -- [ ] Delete the old on-disk config file `~/.galileo/galileo-python-config.json` and re-authenticate (the SDK creates `~/.galileo/splunk-ao-config.json` automatically) - [ ] Update Python to **≥ 3.11** - [ ] Replace `galileo` with `splunk-ao` in `requirements.txt` / `pyproject.toml` - [ ] Add `grpcio>=1.80.0,<2.0.0` if using the `otel` extra (or use `splunk-ao[otel]`)