mca-sdk 0.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. mca_sdk-0.0.0/CHANGELOG.md +710 -0
  2. mca_sdk-0.0.0/LICENSE +17 -0
  3. mca_sdk-0.0.0/MANIFEST.in +5 -0
  4. mca_sdk-0.0.0/PKG-INFO +1597 -0
  5. mca_sdk-0.0.0/README.md +1513 -0
  6. mca_sdk-0.0.0/mca_sdk/FOR_AI_ASSISTANTS.md +202 -0
  7. mca_sdk-0.0.0/mca_sdk/__init__.py +76 -0
  8. mca_sdk-0.0.0/mca_sdk/autolog/__init__.py +185 -0
  9. mca_sdk-0.0.0/mca_sdk/autolog/_base.py +381 -0
  10. mca_sdk-0.0.0/mca_sdk/autolog/_lightgbm.py +111 -0
  11. mca_sdk-0.0.0/mca_sdk/autolog/_sklearn.py +93 -0
  12. mca_sdk-0.0.0/mca_sdk/autolog/_xgboost.py +111 -0
  13. mca_sdk-0.0.0/mca_sdk/buffering/__init__.py +15 -0
  14. mca_sdk-0.0.0/mca_sdk/buffering/exporters.py +1691 -0
  15. mca_sdk-0.0.0/mca_sdk/buffering/queue.py +1275 -0
  16. mca_sdk-0.0.0/mca_sdk/buffering/queued_item.py +37 -0
  17. mca_sdk-0.0.0/mca_sdk/buffering/retry.py +282 -0
  18. mca_sdk-0.0.0/mca_sdk/cli/__init__.py +10 -0
  19. mca_sdk-0.0.0/mca_sdk/cli/_bootstrap.py +172 -0
  20. mca_sdk-0.0.0/mca_sdk/cli/init.py +683 -0
  21. mca_sdk-0.0.0/mca_sdk/cli/instrument.py +339 -0
  22. mca_sdk-0.0.0/mca_sdk/cli/run.py +339 -0
  23. mca_sdk-0.0.0/mca_sdk/config/__init__.py +5 -0
  24. mca_sdk-0.0.0/mca_sdk/config/settings.py +1898 -0
  25. mca_sdk-0.0.0/mca_sdk/core/__init__.py +15 -0
  26. mca_sdk-0.0.0/mca_sdk/core/client.py +3150 -0
  27. mca_sdk-0.0.0/mca_sdk/core/gcp_auth.py +460 -0
  28. mca_sdk-0.0.0/mca_sdk/core/providers.py +772 -0
  29. mca_sdk-0.0.0/mca_sdk/exporters/__init__.py +9 -0
  30. mca_sdk-0.0.0/mca_sdk/exporters/gcp_logging.py +562 -0
  31. mca_sdk-0.0.0/mca_sdk/exporters/gcp_trace_exporter.py +865 -0
  32. mca_sdk-0.0.0/mca_sdk/integrations/__init__.py +45 -0
  33. mca_sdk-0.0.0/mca_sdk/integrations/bridge.py +345 -0
  34. mca_sdk-0.0.0/mca_sdk/integrations/decorators.py +523 -0
  35. mca_sdk-0.0.0/mca_sdk/integrations/genai.py +284 -0
  36. mca_sdk-0.0.0/mca_sdk/integrations/litellm_callback.py +689 -0
  37. mca_sdk-0.0.0/mca_sdk/integrations/state.py +197 -0
  38. mca_sdk-0.0.0/mca_sdk/py.typed +2 -0
  39. mca_sdk-0.0.0/mca_sdk/registry/__init__.py +22 -0
  40. mca_sdk-0.0.0/mca_sdk/registry/client.py +1048 -0
  41. mca_sdk-0.0.0/mca_sdk/registry/models.py +170 -0
  42. mca_sdk-0.0.0/mca_sdk/registry/telemetry.py +72 -0
  43. mca_sdk-0.0.0/mca_sdk/resilience/__init__.py +10 -0
  44. mca_sdk-0.0.0/mca_sdk/resilience/circuit_breaker.py +321 -0
  45. mca_sdk-0.0.0/mca_sdk/resilience/dead_letter_queue.py +611 -0
  46. mca_sdk-0.0.0/mca_sdk/security/__init__.py +47 -0
  47. mca_sdk-0.0.0/mca_sdk/security/_testing.py +11 -0
  48. mca_sdk-0.0.0/mca_sdk/security/certificate.py +261 -0
  49. mca_sdk-0.0.0/mca_sdk/security/certificates.py +541 -0
  50. mca_sdk-0.0.0/mca_sdk/security/encryption.py +664 -0
  51. mca_sdk-0.0.0/mca_sdk/security/migration.py +205 -0
  52. mca_sdk-0.0.0/mca_sdk/utils/__init__.py +5 -0
  53. mca_sdk-0.0.0/mca_sdk/utils/exceptions.py +215 -0
  54. mca_sdk-0.0.0/mca_sdk/utils/gcp_validators.py +68 -0
  55. mca_sdk-0.0.0/mca_sdk/utils/phi_utils.py +84 -0
  56. mca_sdk-0.0.0/mca_sdk/utils/routing.py +162 -0
  57. mca_sdk-0.0.0/mca_sdk/utils/serialization.py +407 -0
  58. mca_sdk-0.0.0/mca_sdk/utils/version_check.py +90 -0
  59. mca_sdk-0.0.0/mca_sdk/validation/__init__.py +241 -0
  60. mca_sdk-0.0.0/mca_sdk/validation/attributes.py +416 -0
  61. mca_sdk-0.0.0/mca_sdk/validation/naming_conventions.py +94 -0
  62. mca_sdk-0.0.0/mca_sdk/validation/result.py +33 -0
  63. mca_sdk-0.0.0/mca_sdk/validation/rules.py +117 -0
  64. mca_sdk-0.0.0/mca_sdk/validation/schema.py +476 -0
  65. mca_sdk-0.0.0/mca_sdk/validation/telemetry_attributes.py +390 -0
  66. mca_sdk-0.0.0/mca_sdk/validation/validator.py +140 -0
  67. mca_sdk-0.0.0/mca_sdk/version.py +17 -0
  68. mca_sdk-0.0.0/mca_sdk.egg-info/PKG-INFO +1597 -0
  69. mca_sdk-0.0.0/mca_sdk.egg-info/SOURCES.txt +79 -0
  70. mca_sdk-0.0.0/mca_sdk.egg-info/dependency_links.txt +1 -0
  71. mca_sdk-0.0.0/mca_sdk.egg-info/entry_points.txt +4 -0
  72. mca_sdk-0.0.0/mca_sdk.egg-info/requires.txt +78 -0
  73. mca_sdk-0.0.0/mca_sdk.egg-info/top_level.txt +1 -0
  74. mca_sdk-0.0.0/pyproject.toml +109 -0
  75. mca_sdk-0.0.0/setup.cfg +4 -0
  76. mca_sdk-0.0.0/setup.py +112 -0
  77. mca_sdk-0.0.0/tests/test_agentic.py +291 -0
  78. mca_sdk-0.0.0/tests/test_basic_export.py +77 -0
  79. mca_sdk-0.0.0/tests/test_gcp_registry_auth.py +135 -0
  80. mca_sdk-0.0.0/tests/test_goal_context_token_fix.py +141 -0
  81. mca_sdk-0.0.0/tests/test_registry_integration.py +365 -0
@@ -0,0 +1,710 @@
1
+ # Changelog
2
+
3
+ All notable changes to the MCA SDK will be documented in this file.
4
+
5
+ ## [0.8.11] - 2026-04-03
6
+
7
+ ### Fixed
8
+ - **RegistryClient**: Reverted the unsupported `version` parameter usage for legacy registry API endpoint (`/api/v1/configs/{model_id}`). The version parameter is now ignored and a warning is logged, preventing 404/rejection errors when using legacy registry endpoints.
9
+
10
+ ## [0.8.10] - 2026-04-02
11
+
12
+ ### Fixed
13
+ - **Registry API Endpoint**: Reverted to `/api/v1/configs/{model_id}` from `/models/{model_id}`
14
+ - **Root Cause**: The new `/models/{model_id}` endpoint (introduced in v0.8.6) returns 404 for all registered models
15
+ - **Solution**: Reverted to the old `/api/v1/configs/{model_id}` endpoint which still works and has model data
16
+ - **Impact**: Fixes RegistryConfigNotFoundError for all models including patient-readmission-classifier-v1, medical-research-assistant, and clinical-notes-summarizer-v2
17
+ - **Future**: Will re-migrate to new endpoint once Registry team completes data migration to `/models/` endpoint
18
+
19
+ ## [0.8.9] - 2026-04-01
20
+
21
+ ### Fixed
22
+ - **Reverted Registry API version=latest behavior**: Reverted the change introduced in v0.8.6 that explicitly sent `version=latest` when fetching model configurations without a specified version.
23
+ - **Root Cause**: The Registry API backend does not support the literal string "latest" and treating it as a semantic version caused `404 Not Found` errors.
24
+ - **Solution**: The SDK now omits the `version` parameter entirely when requesting the latest version, matching pre-0.8.6 behavior.
25
+ - **API Contract Update**: The API contract documentation has been updated to explicitly state that omitting the parameter is the standard way to request the latest version, and "latest" is not a supported literal string.
26
+
27
+ ## [0.8.8] - 2026-03-27
28
+
29
+ ### Fixed
30
+ - **CRITICAL: Counter Metric Instrumentation Bug** - Fixed `record_counter()` and `record_gauge()` methods creating incorrect instrument types
31
+ - **Root Cause**: `record_counter()` was calling `record_metric()` without specifying `instrument_type="counter"`, causing counters to be created as Histograms
32
+ - **Impact**: Counter metrics like `emms_genai_requests_total` were recorded as Histograms, making them invisible to aggregation queries that expect counter semantics (e.g., `counter-increase` CTEs in BigQuery)
33
+ - **Affected Metrics**: All metrics recorded via `record_counter()` including:
34
+ - `emms_genai_requests_total` (GenAI request counter)
35
+ - `emms_model_predictions_total` (prediction counter)
36
+ - Any custom counters recorded by applications
37
+ - **Symptoms**: Aggregation ETL queries finding latency metrics but no request counters; traces present but counter data missing
38
+ - **Fix**: Added explicit `instrument_type="counter"` parameter to `record_counter()` and `instrument_type="up_down_counter"` to `record_gauge()`
39
+ - **Verification**: Counter instruments now correctly created as `_Counter` type with `add()` method instead of `_Histogram` with `record()` method
40
+ - **Models Affected**: clinical-notes-summarizer-v2 and any other GenAI models using LiteLLM callback
41
+ - **Action Required**: Redeploy models using SDK v0.8.8+ to populate counter metrics in aggregation tables
42
+
43
+ ## [0.8.7] - 2026-03-27
44
+
45
+ ### Fixed
46
+ - **CRITICAL: Counter Metric Instrumentation Bug** - Fixed `record_counter()` and `record_gauge()` methods creating incorrect instrument types
47
+ - **Root Cause**: `record_counter()` was calling `record_metric()` without specifying `instrument_type="counter"`, causing counters to be created as Histograms
48
+ - **Impact**: Counter metrics like `emms_genai_requests_total` were recorded as Histograms, making them invisible to aggregation queries that expect counter semantics (e.g., `counter-increase` CTEs in BigQuery)
49
+ - **Affected Metrics**: All metrics recorded via `record_counter()` including:
50
+ - `emms_genai_requests_total` (GenAI request counter)
51
+ - `emms_model_predictions_total` (prediction counter)
52
+ - Any custom counters recorded by applications
53
+ - **Symptoms**: Aggregation ETL queries finding latency metrics but no request counters; traces present but counter data missing
54
+ - **Fix**: Added explicit `instrument_type="counter"` parameter to `record_counter()` and `instrument_type="up_down_counter"` to `record_gauge()`
55
+ - **Verification**: Counter instruments now correctly created as `_Counter` type with `add()` method instead of `_Histogram` with `record()` method
56
+ - **Models Affected**: clinical-notes-summarizer-v2 and any other GenAI models using LiteLLM callback
57
+ - **Action Required**: Redeploy models using SDK v0.8.7+ to populate counter metrics in aggregation tables
58
+
59
+ ## [0.8.6] - 2026-03-24
60
+
61
+ ### Changed
62
+ - Updated registry API endpoint from `/api/v1/configs/{model_id}` to `/models/{model_id}`
63
+ - Added support for version parameter in model configuration fetches
64
+ - Removed deprecation warning for version parameter in registry client
65
+ - Introduced `DEFAULT_MODEL_VERSION` constant to replace magic string "latest"
66
+ - Enhanced registry client telemetry with cache hit/miss logging and resolved version tracking
67
+
68
+ ### Added - Backward Compatibility
69
+ - **`omit_default_version` parameter** for RegistryClient to support legacy registry APIs
70
+ - Set to `True` to restore pre-0.8.6 behavior (omit version parameter)
71
+ - Defaults to `False` (modern behavior: send `version=latest`)
72
+ - Can be controlled via `MCA_REGISTRY_OMIT_DEFAULT_VERSION` environment variable
73
+ - Logs warning when legacy mode is enabled
74
+ - Allows migration path for systems with non-compliant registry APIs
75
+
76
+ ### Fixed
77
+ - **Registry Client Version Resolution** (Story 8-8): Fixed model configuration fetching to explicitly request `version=latest` when no version is specified, resolving "Model config not found" errors for valid registered models
78
+ - Affected models: patient-readmission-classifier-v1, medical-research-assistant, clinical-notes-summarizer-v2
79
+ - Root cause: Mismatch between cache key semantics (using "latest" string) and API request (omitting version parameter)
80
+ - Impact: Registry refresh now works correctly for all registered models
81
+ - Solution: SDK now explicitly sends `version=latest` parameter when no version specified
82
+ - Error messages improved with actionable guidance when model/version not found
83
+ - Registry client now properly sends version parameter to API when provided
84
+ - Fixed duplicate `capture_output_data` parameter in agentic example causing syntax error
85
+
86
+ ### Added
87
+ - Comprehensive integration tests for registry version parameter handling (7 new tests)
88
+ - Thread-safety validation tests for concurrent registry operations
89
+ - Detailed error messages for 404 responses with troubleshooting guidance
90
+ - DEBUG-level logging for cache operations (hits/misses)
91
+ - INFO-level logging for successful registry fetches with resolved version information
92
+
93
+ ### Documentation
94
+ - Added thread-safety guarantees to RegistryClient class and cache method docstrings
95
+ - Updated fetch_model_config docstring to clarify version parameter behavior
96
+ - Type hints validated with mypy (zero errors)
97
+ - **Async Environment Usage**: Added warnings to RegistryClient docstring and README about synchronous locking and event loop blocking
98
+ - RegistryClient uses `threading.RLock` and is NOT safe to call from async functions
99
+ - Recommended pattern: Initialize during startup, enable background refresh, use @predict() decorator
100
+ - DO NOT call fetch_model_config() from FastAPI endpoints or async request handlers
101
+
102
+ ## [0.8.5] - 2026-03-23
103
+
104
+ ### Added
105
+ - **Mid-Lifecycle Telemetry Flush** (flush method)
106
+ - Added `flush()` method to MCAClient for forcing telemetry export without shutdown
107
+ - Allows batch processing scenarios to flush buffers between batches
108
+ - Safe to call mid-lifecycle, does not affect client state
109
+ - Returns boolean indicating success/failure across all providers
110
+ - Configurable timeout (default: 30 seconds)
111
+
112
+ ### Changed
113
+ - Removed `capture_input_data` parameter from agentic agent example for cleaner configuration
114
+
115
+ ## [0.8.4] - 2026-03-21
116
+
117
+ ### Added
118
+ - **Configurable Metric Filtering** (Story 8.7)
119
+ - SDK now filters unnecessary auto-instrumentation and system metrics before export
120
+ - Dropped metric patterns: `process.*`, `system.*`, `asyncio.*`, `cpython.*`, `http.client.*`, `otel.sdk.*`, `test.*`, `rpc.*`
121
+ - Retained business metrics: `model.*`, `genai.*`, `agent.*`, `vendor.*`, `agentic.*`, `llm_eval/*`
122
+ - Filtering configurable via `filter_system_metrics` parameter (default: True)
123
+ - Reduces Cloud Monitoring costs by eliminating unnecessary custom metric descriptors
124
+ - Implemented using OpenTelemetry Views and DropAggregation
125
+
126
+ ### Fixed
127
+ - **Model Version Fallback Bug**
128
+ - Fixed model_version not falling back to SDK version when not provided via config or registry
129
+ - Ensures model.version resource attribute is always populated for telemetry filtering
130
+ - **Missing Trace Coverage for ML Errors**
131
+ - Added trace span creation in record_error for predictive ML models
132
+ - Ensures errors are visible in distributed traces alongside metrics and logs
133
+
134
+ ## [0.8.3] - 2026-03-20
135
+
136
+ ### Fixed
137
+ - **Metric Cardinality Explosion & Trace Correlation Issues**
138
+ - Defensively pop `prediction_id`, `user_id`, and `session_id` from generic `attributes` in `record_prediction` and `record_error` to prevent metric cardinality explosions.
139
+ - Introduce `span_attributes` parameter in `record_prediction` and `record_error` to allow high-cardinality data safely attached to OpenTelemetry spans instead of metrics.
140
+ - Fix broken trace-to-error correlation in both manual error recording and batch tracking decorators by ensuring `prediction_id` flows through to spans and logging.
141
+
142
+ - **Trace Span Creation for Predictive & Generative Models**
143
+ - Added `mca_client.trace()` context manager around prediction loops.
144
+ - Generate `prediction_id` for trace correlation and add it as a span attribute.
145
+ - Enables trace visibility in GCP Traces Explorer.
146
+
147
+ - **Data Generation Tests**
148
+ - Updated data generation tests to match current model configuration.
149
+
150
+ ## [0.8.2] - 2026-03-19
151
+
152
+ ### Changed
153
+
154
+ - **Registry URL Optional in All Environments (Story 2.7 + Adversarial Review Fixes)**
155
+ - Registry connection is now optional in all environments (dev, prod, staging)
156
+ - Previously: dev/prod required registry_url and model_id, raised ConfigurationError if missing
157
+ - Now: SDK operates normally without registry in any environment, logs informational messages
158
+ - **CRITICAL FIXES** (from adversarial review):
159
+ - `_validate_registry_requirements()` now returns bool to actually control hydration (was theatrical before)
160
+ - Removed dangerous fallback to service_name in `_hydrate_from_registry()`
161
+ - Staging now skips hydration when auth missing (prevents slow 401/timeout on startup)
162
+ - Production defaults to `strict_validation=True` even without registry (prevents security downgrade)
163
+ - CLI template now comments out `model_id` by default (prevents log spam)
164
+ - When both registry_url and model_id are provided, authentication is still required (dev/prod)
165
+ - Staging skips hydration when auth incomplete (prevents startup performance degradation)
166
+ - **Migration**: Prod users without registry should explicitly set `strict_validation=True` if needed
167
+ - **Impact**: Removes artificial barrier for SDK users who don't need registry integration
168
+ - Test coverage: 8 tests (7 updated + 1 new AC2 telemetry test) with network isolation assertions
169
+
170
+ ### Added
171
+
172
+ - **SDK Version in Resource Attributes (Story 1-21)**
173
+ - SDK version automatically added to all resource attributes
174
+ - Two attributes injected: `mca.sdk.version` (custom) and `telemetry.sdk.version` (OpenTelemetry standard)
175
+ - **Immutable**: Cannot be overridden by `extra_resource`, kwargs, or registry config
176
+ - **Universal**: Present in all telemetry signals (metrics, logs, traces)
177
+ - **Tamper-Proof**: User attempts to override are blocked, real SDK version is always used
178
+ - **Use Cases**: Track deployed SDK versions, correlate telemetry with version changes, backward compatibility analysis
179
+ - **Architecture**: Dedicated `mca_sdk/version.py` module eliminates circular dependencies
180
+ - **Testing**: Comprehensive unit and integration tests validate presence in actual exported payloads
181
+ - **Documentation**: Updated `docs/data-models.md` and `docs/api-contracts.md`
182
+
183
+ ## [0.8.1] - 2026-03-19
184
+
185
+ ### Fixed
186
+
187
+ - **LLM Completion Tracking Performance**
188
+ - Fixed major performance bug where OpenTelemetry instruments were dynamically created on every LLM call
189
+ - Implemented pre-created instrument caching in `genai.py` with thread-safe global cache
190
+ - Added `_get_instruments()` helper to retrieve or initialize instruments once per client
191
+ - Reduced overhead for high-frequency LLM operations (GenAI workloads)
192
+ - All metric instruments now created once and reused: requests_total, requests_failed_total, tokens_total, latency_seconds, cost_dollars, embedding_*
193
+ - Thread-safe implementation using locks to prevent race conditions
194
+ - Impact: Significant performance improvement for applications with high LLM request rates
195
+
196
+ ### Changed
197
+
198
+ - **Registry URL Optional in All Environments (Story 2.7 + Adversarial Review Fixes)**
199
+ - Registry connection is now optional in all environments (dev, prod, staging)
200
+ - Previously: dev/prod required registry_url and model_id, raised ConfigurationError if missing
201
+ - Now: SDK operates normally without registry in any environment, logs informational messages
202
+ - **CRITICAL FIXES** (from adversarial review):
203
+ - `_validate_registry_requirements()` now returns bool to actually control hydration (was theatrical before)
204
+ - Removed dangerous fallback to service_name in `_hydrate_from_registry()`
205
+ - Staging now skips hydration when auth missing (prevents slow 401/timeout on startup)
206
+ - Production defaults to `strict_validation=True` even without registry (prevents security downgrade)
207
+ - CLI template now comments out `model_id` by default (prevents log spam)
208
+ - When both registry_url and model_id are provided, authentication is still required (dev/prod)
209
+ - Staging skips hydration when auth incomplete (prevents startup performance degradation)
210
+ - **Migration**: Prod users without registry should explicitly set `strict_validation=True` if needed
211
+ - **Impact**: Removes artificial barrier for SDK users who don't need registry integration
212
+ - Test coverage: 8 tests (7 updated + 1 new AC2 telemetry test) with network isolation assertions
213
+
214
+ ## [0.8.0] - 2026-03-18
215
+
216
+ ### Added
217
+
218
+ - **SDK Version in Resource Attributes (Story 1-21)**
219
+ - SDK version automatically added to all resource attributes
220
+ - Two attributes injected: `mca.sdk.version` (custom) and `telemetry.sdk.version` (OpenTelemetry standard)
221
+ - **Immutable**: Cannot be overridden by `extra_resource`, kwargs, or registry config
222
+ - **Universal**: Present in all telemetry signals (metrics, logs, traces)
223
+ - **Tamper-Proof**: User attempts to override are blocked, real SDK version is always used
224
+ - **Use Cases**: Track deployed SDK versions, correlate telemetry with version changes, backward compatibility analysis
225
+ - **Architecture**: Dedicated `mca_sdk/version.py` module eliminates circular dependencies
226
+ - **Testing**: Comprehensive unit and integration tests validate presence in actual exported payloads
227
+ - **Documentation**: Updated `docs/data-models.md` and `docs/api-contracts.md`
228
+ ### Changed (BREAKING)
229
+
230
+ - **PHI/PII Masking Removed**
231
+ - PHI_PATTERNS regex list removed from client.py
232
+ - _sanitize_phi() function removed from gcp_logging.py
233
+ - All PHI masking tests removed (test_phi_masking.py, test_gcp_logging_phi.py)
234
+ - "Dual-purpose masking" security model removed
235
+ - **KEPT**: CREDENTIAL_PATTERNS and credential masking (unchanged)
236
+ - **KEPT**: phi_utils.py field name extraction (helps apps identify PHI)
237
+ - **Impact**: Applications now have 100% responsibility for PHI sanitization
238
+ - **SDK only masks technical credentials** (AWS/GCP keys, tokens, JWTs)
239
+ - **No breaking API changes** - removal is internal implementation only
240
+ - **Migration**: Review your application code to ensure PHI is sanitized BEFORE calling SDK methods
241
+ - Do not rely on SDK to catch PHI patterns
242
+ - Use `phi_utils.extract_phi_field_names()` to identify PHI fields from registry
243
+ - **Rationale**: SDK cannot know domain-specific PHI context. Regex-based masking is insufficient and creates false positives. Clear responsibility boundaries prevent security assumptions.
244
+
245
+ ### Changed (BREAKING)
246
+
247
+ - **Default Data Capture Enabled**
248
+ - `capture_input_data` default changed from `False` to `True`
249
+ - `capture_output_data` default changed from `False` to `True`
250
+ - `capture_input` default changed from `False` to `True` (Decorators)
251
+ - `capture_output` default changed from `False` to `True` (Decorators)
252
+ - `record_error_messages` default changed from `False` to `True` (LiteLLM Callback)
253
+ - `persist_queue` default changed from `False` to `True` (Buffering)
254
+ - **Impact**: Prompts, completions, errors, and input/output payload traces are NOW captured and buffered by default.
255
+ - **Migration**: Explicitly set these parameters to `False` if you do not want input/output capture.
256
+ - **Rationale**: PII and PHI handling relies on downstream access controls and sanitization policies.
257
+ - Affects:
258
+ - `MCAConfig` defaults
259
+ - `create_genai_client()` helper function (now defaults to True)
260
+ - `MCALiteLLMCallback` fallback defaults and constructor
261
+ - `@predict()` and `@instrument_model` decorator behavior
262
+
263
+ ### Added
264
+
265
+ - **Thresholds as Resource Attributes (Production-Ready)**
266
+ - Registry API thresholds automatically added as OpenTelemetry resource attributes
267
+ - Thresholds prefixed with `threshold.` (e.g., `threshold.latency_ms`, `threshold.accuracy_min`)
268
+ - **Preserves native numeric types**: int stays int, float stays float (no forced conversion)
269
+ - Enables proper numeric filtering, sorting, and aggregations in downstream systems
270
+ - **IMPORTANT:** Resources are immutable - thresholds evaluated ONCE at SDK initialization
271
+ - **Comprehensive Safeguards:**
272
+ - Boolean rejection: Explicitly rejects `bool` types (subclass of `int` in Python)
273
+ - Infinity rejection: `math.isinf()` check prevents OpenTelemetry exporter crashes
274
+ - NaN rejection: `math.isnan()` check prevents invalid telemetry data
275
+ - None rejection: Prevents string "None" pollution
276
+ - Maximum 50 thresholds: First 50 kept (dict iteration order), rest dropped with clear warning
277
+ - Key sanitization with collision detection: Invalid chars→`_`, collisions logged
278
+ - Key length accounting: Max 53-char names (63 total with "threshold." prefix)
279
+ - User precedence: User-provided `extra_resource` keys never silently overwritten
280
+ - Module-level imports: `math` and `re` imported at module level (not function level)
281
+ - SDK logger used throughout (not global `logging`)
282
+
283
+ ## [0.7.7] - 2026-03-12
284
+
285
+ ### Fixed
286
+
287
+ - **Registry Token Validation with GCP Auth**
288
+ - Allow GCP auth without requiring registry token in production environment
289
+ - Fixed validation logic to check for `use_gcp_auth` before requiring `MCA_REGISTRY_TOKEN`
290
+ - When `use_gcp_auth=True`, token is no longer required
291
+
292
+ ## [0.7.2] - 2026-03-10
293
+
294
+ ### Fixed
295
+
296
+ - **mca-instrument Endpoint Mapping**
297
+ - Map `MCA_COLLECTOR_ENDPOINT` to `OTEL_EXPORTER_OTLP_ENDPOINT` for opentelemetry-instrument
298
+ - Map `MCA_SERVICE_NAME` to `OTEL_SERVICE_NAME` for proper service identification
299
+ - Fixes issue where telemetry was sent to localhost instead of configured collector endpoint
300
+
301
+ ## [0.7.1] - 2026-03-09
302
+
303
+ ### Fixed
304
+
305
+ - **CLI Entry Points Not Installed**
306
+ - Added `[project.scripts]` section to `pyproject.toml` for CLI tools
307
+ - Fixes `mca-init`, `mca-instrument`, and `mca-run` commands not being available after pip install
308
+ - CLI tools now properly installed to user's PATH
309
+
310
+ ## [0.7.0] - 2026-03-09
311
+
312
+ ### Changed (BREAKING)
313
+
314
+ - **Default Validation Mode Changed to Relaxed**
315
+ - `strict_validation` default changed from `True` to `False`
316
+ - **Impact**: Users who relied on default strict validation will now get relaxed validation
317
+ - **Migration**: Explicitly set `strict_validation=True` if you need strict validation
318
+ - **Rationale**: Lower barrier to entry for development and prototyping while maintaining production safety
319
+
320
+ ### Added
321
+
322
+ - **Flexible Validation System**
323
+ - Relaxed validation mode (new default): Only requires `service.name`
324
+ - Strict validation mode: Requires all model-type-specific fields (auto-enabled for registry integration)
325
+ - INFO-level logging for missing optional fields in relaxed mode
326
+ - Auto-detection: Strict validation automatically enabled when `registry_url` is configured
327
+
328
+ ### Fixed
329
+
330
+ - **Package Configuration Sync**
331
+ - Synced `pyproject.toml` with `setup.py` to include all optional dependencies
332
+ - Added missing extras: `prometheus`, `gcp-auth`, `gcp-secrets`, `gcp-trace`, `gcp-logging`, `autolog`, `instrument`
333
+ - Fixed `[instrument]` extra not being available in published package
334
+ - Users can now install: `pip install "mca-sdk[instrument]"` for zero-code instrumentation
335
+
336
+ ### Migration Guide
337
+
338
+ **If you need strict validation** (all model-type fields required):
339
+ ```python
340
+ # Option 1: Explicit configuration
341
+ client = MCAClient(
342
+ service_name="my-model",
343
+ strict_validation=True, # Explicitly enable
344
+ # ... other required fields
345
+ )
346
+
347
+ # Option 2: Use registry integration (auto-enables strict validation)
348
+ client = MCAClient(
349
+ service_name="my-model",
350
+ registry_url="https://registry.example.com", # Auto-enables strict validation
351
+ # ... other required fields
352
+ )
353
+ ```
354
+
355
+ **If you want minimal validation** (service_name only):
356
+ ```python
357
+ # Default behavior in v0.7.0 - no changes needed
358
+ client = MCAClient(service_name="my-model") # Works!
359
+ ```
360
+
361
+ ## [0.6.7] - 2026-03-05
362
+
363
+ ### Fixed
364
+ - Add missing resource attributes for agentic model type
365
+
366
+ ## [0.6.5] - 2026-03-05
367
+
368
+ ### Fixed
369
+ - Lower OpenTelemetry requirement to >=1.35.0 for google-adk compatibility
370
+
371
+ ## [0.6.4] - 2026-03-05
372
+
373
+ ### Fixed
374
+ - Export print_gcp_auth_status and print_collector_status from shared module
375
+ - Add fallback for OpenTelemetry logs import compatibility across versions
376
+
377
+ ## [0.6.1] - 2026-02-26
378
+
379
+ ### Fixed
380
+ - **CRITICAL: Context Token Handling in Agentic AI Goal Tracking**
381
+ - Fixed TypeError when detaching context in `record_goal_completed()`
382
+ - **Problem**: `record_goal_started()` was incorrectly using `trace.use_span()` which returns a context manager, not a Token
383
+ - **Error**: `TypeError: expected an instance of Token, got _AgnosticContextManager`
384
+ - **Solution**: Changed to use `context.attach(trace.set_span_in_context(span))` for proper Token handling
385
+ - **Impact**: All users of `record_goal_started()` + `record_goal_completed()` were affected
386
+ - **Severity**: High - causes runtime errors for agentic AI features
387
+
388
+ ### Documentation
389
+ - Rebuilt end-to-end demo notebook with comprehensive v0.6.0 feature coverage
390
+ - Added demonstrations of all 11 telemetry features
391
+ - Added model input/output capture examples (Story 1-18)
392
+ - Fixed `record_goal_started()` parameter usage in examples
393
+ - Created notebooks/README.md with usage guide and troubleshooting
394
+
395
+ ## [0.6.0] - 2026-02-26
396
+
397
+ ### Added
398
+ - **GCP Authentication Support for Registry Client**
399
+ - Added `use_gcp_auth` parameter to `RegistryClient` initialization
400
+ - Enables automatic GCP credential-based authentication for Registry API
401
+ - Properly passed from `MCAConfig` to `RegistryClient` in client initialization
402
+
403
+ - **Comprehensive End-to-End Tests** (Story 6-16)
404
+ - Full OTLP JSON validation for metrics, logs, and traces
405
+ - Multi-model telemetry validation across all model types
406
+ - Error scenario testing (network failures, invalid data, collector downtime)
407
+ - Context propagation validation for distributed tracing
408
+
409
+ - **Integration Tests with OTel Collector** (Story 6-7)
410
+ - Real collector telemetry flow validation
411
+ - High availability features testing (HPA, persistent volumes, DLQ)
412
+ - Collector self-monitoring validation
413
+ - Batch processing and attribute enrichment verification
414
+
415
+ - **Load Testing Framework** (Story 6-8)
416
+ - Performance testing at 1000 req/s
417
+ - Telemetry completeness validation
418
+ - Collector monitoring utilities
419
+ - Load test report generation
420
+
421
+ - **Integration Guides** (Story 5-5)
422
+ - Complete guides for Predictive ML, GenAI, Agentic AI, and Vendor Bridge patterns
423
+ - pytest-based testing examples for each model type
424
+ - Context propagation explanations with code examples
425
+
426
+ - **Input/Output Capture** (Story 1-18)
427
+ - Enhanced `@predict()` decorator with input/output span attachment
428
+ - Configurable via `capture_input` and `capture_output` parameters
429
+ - Sanitization warnings for PHI protection
430
+
431
+ ### Changed
432
+ - **OTel Collector Configuration Updates**
433
+ - Enhanced self-monitoring metrics collection
434
+ - Improved batch processor settings for high throughput
435
+ - Updated attributes processor for GCP metadata enrichment
436
+
437
+ - **Integration Decorator Improvements**
438
+ - Fixed `@predict()` and `@batch_predict()` decorators
439
+ - Better error handling and span lifecycle management
440
+ - Improved attribute validation and length limits
441
+
442
+ ### Fixed
443
+ - Registry client GCP authentication parameter propagation from config
444
+ - Path validation in `TelemetryQueue` for disk persistence
445
+ - `ModelConfig` backward compatibility for older API responses
446
+ - Pipeline test failures in CI/CD
447
+ - Instrumentation decorator attribute handling
448
+
449
+ ### Documentation
450
+ - Updated downstream integration docs for dot notation metric naming
451
+ - Added collector metrics guide
452
+ - Enhanced Kubernetes deployment README with HA features
453
+ - Added Pub/Sub DLQ documentation and replay processor
454
+
455
+ ## [0.5.1] - 2026-02-25
456
+
457
+ ### Fixed
458
+ - **CRITICAL: GenAI Metric Double-Prefix Bug** (Production Issue)
459
+ - Fixed incorrect metric names in Google Cloud Monitoring / Managed Prometheus
460
+ - **Problem**: Metrics appeared as `emms_emms_genai_requests_total` instead of `emms_genai_requests_total`
461
+ - **Root Cause**: GenAI integration was prepending `emms_` prefix, but OTel Collector's Prometheus exporter also adds namespace prefix
462
+ - **Solution**: Switched to dot notation (`genai.requests_total`) matching predictive ML pattern
463
+ - **Affected Components**:
464
+ - `track_llm_completion()` in `genai.py`
465
+ - `track_llm_embedding()` in `genai.py`
466
+ - `batch_predict` decorator in `decorators.py`
467
+ - Metric validation schema updated to expect dot notation
468
+ - **Impact**: All GenAI metrics from deployed agents (AI Ops Agent dogfooding) now report correctly
469
+ - **Migration**: If you query Prometheus/GMP directly, update queries from `emms_emms_genai_*` to `emms_genai_*`
470
+
471
+ ### Changed
472
+ - Metric naming convention now uses dot notation for all metric types (e.g., `genai.requests_total`, `model.predictions_total`)
473
+ - Validation schema updated to reflect dot-notation pattern
474
+
475
+ ## [0.5.0] - 2026-02-25
476
+
477
+ ### Added
478
+ - **Registry API GCP Authentication Documentation**
479
+ - New comprehensive guide: [`docs/registry-gcp-auth-guide.md`](docs/registry-gcp-auth-guide.md)
480
+ - Covers all authentication methods: ADC, service account JSON, Workload Identity, gcloud CLI
481
+ - Complete examples for Vertex AI Workbench, Cloud Run, GKE, and local development
482
+ - Token management and automatic refresh documentation
483
+ - Troubleshooting guide with common issues and solutions
484
+ - Security best practices for production deployments
485
+ - Verified with integration tests against real Registry API
486
+
487
+ - **GCP Cloud Trace Direct Export** (Story 6-3)
488
+ - New `GCPCloudTraceExporter` for exporting traces directly to Google Cloud Trace
489
+ - Configuration fields: `gcp_trace_enabled` (bool), `gcp_project_id` (str)
490
+ - Environment variables: `MCA_GCP_TRACE_ENABLED`, `MCA_GCP_PROJECT_ID`
491
+ - Full span fidelity: status codes, span kinds, links, events, resource attributes
492
+ - Production features: retry logic, timeout protection, batch splitting, validation
493
+ - Internal telemetry metrics for observability (spans exported, failures, retries)
494
+ - Install with: `pip install mca-sdk[gcp-trace]` or `pip install mca-sdk[gcp]`
495
+ - **Note**: Requires GCP credentials with scope `https://www.googleapis.com/auth/trace.append`
496
+
497
+ - **Registry API Response Structure Updates** (Story 2.2 - API Integration)
498
+ - Updated [`ModelConfig`](mca-prototype/mca_sdk/registry/models.py) dataclass to match actual API response structure
499
+ - Added `registry_id` field (optional, can be null for vendor models)
500
+ - Added `deployment_id` field (optional, can be null for vendor models)
501
+ - Added `association_id_column` field (optional, for time-series models)
502
+ - Added `created_at` and `updated_at` timestamp fields (optional, for debugging)
503
+ - Updated [`RegistryClient`](mca-prototype/mca_sdk/registry/client.py) to correctly extract fields from API response:
504
+ - `model_version` now extracted from top-level (not nested in config)
505
+ - `thresholds` extracted from top-level (not nested in config)
506
+ - `extra_resource` extracted from nested `config.extra_resource` (not top-level)
507
+ - Handles `config: null` case gracefully
508
+ - Handles `phi_fields: {}` empty dict case
509
+ - Added [`extract_phi_field_names()`](mca-prototype/mca_sdk/utils/phi_utils.py) utility function
510
+ - Extracts field names from nested PHI structure: `{"patient_id": {"criticality": "yes"}}`
511
+ - Handles empty dict case: `{}`
512
+ - Used for PHI masking operations
513
+ - **Note**: All `extra_resource` values are strings (JSONB storage), passed as-is to OpenTelemetry
514
+
515
+ ### Changed
516
+ - **BREAKING CHANGE: predict() Decorator Defaults** (Story 1.13.6 - Adversarial Review Finding 1)
517
+ - `capture_input` default changed from `True` to **`False`**
518
+ - `capture_output` default changed from `True` to **`False`**
519
+ - **Rationale**: Safer HIPAA compliance defaults - prevents accidental PHI capture
520
+ - **Migration Guide**: If you rely on automatic input/output capture, explicitly set parameters:
521
+ ```python
522
+ # OLD (implicit True - will now be False)
523
+ @client.predict()
524
+ def predict(data):
525
+ return model.predict(data)
526
+
527
+ # NEW (explicit opt-in required)
528
+ @client.predict(capture_input=True, capture_output=True)
529
+ def predict(data):
530
+ # IMPORTANT: Ensure data is sanitized before calling
531
+ return model.predict(data)
532
+ ```
533
+ - **Impact**: Code using `@client.predict()` without parameters will no longer capture input/output data
534
+ - **Security**: This change reduces risk of accidental PHI exposure in telemetry
535
+
536
+ ### Added
537
+ - **Enhanced PHI Masking Patterns** (Story 1.13.6 - Adversarial Review Finding 2)
538
+ - Added ZIP code pattern (5-digit and ZIP+4 formats)
539
+ - Added common name patterns (First Last, Last First formats)
540
+ - Added street address pattern (basic detection)
541
+ - **Note**: Regex-based PHI masking has inherent limitations. Applications MUST sanitize data before instrumentation.
542
+
543
+ ### Security
544
+ - Improved default security posture for data capture in predict() decorator
545
+ - Expanded PHI detection patterns for better protection in error messages and logs
546
+
547
+ ### Changed (from Unreleased)
548
+ - **BREAKING CHANGE: HTTPS Enforcement** (Story 3.7)
549
+ - Both `registry_url` and `collector_endpoint` now **require HTTPS** for non-localhost endpoints
550
+ - HTTP connections to production endpoints are blocked with `ConfigurationError`
551
+ - **Migration Guide**: Update all production endpoint URLs from `http://` to `https://`
552
+ - Localhost exception: HTTP remains allowed for `localhost`, full `127.0.0.0/8` range, and `::1` for development
553
+ - Enhanced security validation prevents credential exposure over unencrypted connections
554
+ - **Previous Behavior**: HTTP to production endpoints raised a `SecurityWarning` but was allowed
555
+ - **New Behavior**: HTTP to production endpoints raises `ConfigurationError` and blocks initialization
556
+
557
+ ### Security
558
+ - Enhanced loopback detection with full IPv4 127.0.0.0/8 range support and IPv6 ::1
559
+ - Protection against hostname substring attacks (e.g., `localhost.attacker.com`)
560
+ - Case-insensitive localhost matching per RFC 4343
561
+
562
+ ## [0.4.0] - 2026-01-26
563
+
564
+ ### Added
565
+ - **Background Registry Refresh Thread** (Story 2.3)
566
+ - Automatic refresh of registry config at configurable intervals
567
+ - Daemon thread with graceful shutdown
568
+ - Thread-safe config updates with locking
569
+ - Comprehensive unit tests for thread safety and lifecycle
570
+
571
+ - **Attributes Processor Integration** (Story 4.3)
572
+ - OpenTelemetry Collector attributes processor for metadata enrichment
573
+ - Automatic addition of `gcp.region` and `environment` attributes
574
+ - Non-overwriting insertion semantics to preserve existing attributes
575
+ - Validated with functional testing across all telemetry types (metrics, logs, traces)
576
+
577
+ - **Enhanced Demo Scripts**
578
+ - OTLP endpoint configuration for better local development
579
+ - Improved logging and error handling
580
+
581
+ ### Changed
582
+ - **OpenTelemetry Dependencies** - Updated from 1.20.0 to 1.39.0
583
+ - `opentelemetry-api>=1.39.0`
584
+ - `opentelemetry-sdk>=1.39.0`
585
+ - `opentelemetry-exporter-otlp-proto-http>=1.39.0`
586
+ - **Breaking Changes**: OTel 1.39.0 includes significant changes including `LogData` removal (replaced with `ReadableLogRecord`/`ReadWriteLogRecord`), Events API deprecation, and Python 3.8 support dropped. Review [OTel Python CHANGELOG](https://github.com/open-telemetry/opentelemetry-python/blob/main/CHANGELOG.md) for migration guidance.
587
+ - **Dependency Reorganization** - Moved `requests` from core dependencies to optional `[vendor]` extras. Install with `pip install mca-sdk[vendor]` if using vendor model integrations.
588
+
589
+ ### Fixed
590
+ - CI pipeline refinements for better reliability
591
+ - Removed orphaned pyproject.toml scan after merge
592
+ - Updated pip-audit command to skip editable packages
593
+
594
+ ### Security
595
+ - Added `protobuf>=5.0,<6.0` constraint to mitigate CVE-2026-0994 (DoS via nested Any messages) until patched version is available
596
+
597
+ ## [0.3.0] - 2026-01-22
598
+
599
+ ### Added
600
+ - **Custom Exception Hierarchy** (Story 1.14)
601
+ - `MCASDKError` - Base exception class for all SDK errors
602
+ - `ValidationError` - Raised when validation fails (metric names, attributes)
603
+ - `BufferingError` - Raised when buffering operations fail (queue full, disk failure)
604
+ - `ConfigurationError` - Raised when configuration is invalid or incomplete
605
+ - `RegistryError` - Base exception for registry operations
606
+ - `RegistryConnectionError` - Raised when unable to connect to registry
607
+ - `RegistryConfigNotFoundError` - Raised when model config not found in registry
608
+ - `RegistryAuthError` - Raised when registry authentication fails
609
+ - All exceptions exported from main `mca_sdk` package for easy catching
610
+ - Helpful error messages with context for debugging
611
+
612
+ ### Changed
613
+ - **Enhanced Configuration Validation** (Story 1.15)
614
+ - `MCAConfig.__post_init__` now raises `ConfigurationError` (was generic `Exception`)
615
+ - `MCAConfig.from_env` raises `ConfigurationError` for invalid integer values
616
+ - `MCAConfig.from_file` raises `ConfigurationError` for file/parsing errors
617
+ - `MCAConfig.load` enforces security: `registry_token` via environment only
618
+ - Better error messages with suggested fixes for missing `service_name`
619
+ - URL validation for `collector_endpoint` and `registry_url`
620
+ - Security warnings for HTTP endpoints (non-localhost) using `SecurityWarning` category
621
+
622
+ ## [0.2.0] - 2026-01-12
623
+
624
+ ### Added
625
+ - **Model Registry Integration**: Centralized configuration management system
626
+ - `RegistryClient` for fetching model config from registry API
627
+ - Support for `GET /models/{model_id}` and `GET /deployments/{deployment_id}` endpoints
628
+ - Automatic retry with exponential backoff using existing `RetryPolicy`
629
+ - In-memory cache with configurable TTL (default 10 minutes)
630
+ - Bearer token authentication with HTTPS enforcement
631
+
632
+ - **Dynamic Configuration**
633
+ - `MCAConfig` extended with 5 new fields: `registry_url`, `registry_token`, `refresh_interval_secs`, `prefer_registry`, `deployment_id`
634
+ - Environment variable support: `MCA_REGISTRY_URL`, `MCA_REGISTRY_TOKEN`, etc.
635
+ - Config precedence: kwargs > registry > env > YAML > defaults
636
+
637
+ - **Background Refresh**
638
+ - Automatic refresh of thresholds and PHI fields every 10 minutes (configurable)
639
+ - Identity fields (service_name, model_id) are immutable after startup
640
+ - Graceful handling of registry failures with fallback to last-known config
641
+
642
+ - **PHI Fields Management**
643
+ - Union of local and registry PHI fields for comprehensive masking
644
+ - Dynamic updates via background refresh
645
+
646
+ - **Registry Telemetry**
647
+ - Self-monitoring metrics: `mca.registry.refresh_success_total`, `mca.registry.refresh_latency_seconds`, `mca.registry.errors_total`
648
+
649
+ - **Security**
650
+ - HTTPS required for non-localhost registry endpoints
651
+ - Token never logged (even at DEBUG level)
652
+ - Query parameters excluded from logs
653
+
654
+ - **Testing**
655
+ - 22 unit tests for RegistryClient (fetch, cache, retry, auth)
656
+ - 11 unit tests for hydration flow and config precedence
657
+ - 8 integration tests with FastAPI mock registry
658
+
659
+ ### Changed
660
+ - `MCAClient.__init__` now performs registry hydration before provider setup
661
+ - `MCAClient.shutdown` now stops background refresh thread and closes registry client
662
+ - `setup_all_providers` accepts `extra_resource` parameter for registry attributes
663
+ - Provider resource attributes now include registry-provided `extra_resource` fields
664
+
665
+ ### API Additions
666
+ - `MCAClient.thresholds` property - Access current thresholds from registry
667
+ - `RegistryClient` class exported from main package
668
+ - `ModelConfig` and `DeploymentConfig` dataclasses exported from main package
669
+
670
+ ## [0.1.0] - 2026-01-21
671
+
672
+ ### Added
673
+ - Core MCA SDK with `MCAClient` for HIPAA-compliant OpenTelemetry instrumentation
674
+ - Multi-source configuration system with precedence: kwargs > registry > env > YAML > defaults
675
+ - Registry integration with automatic caching and retry mechanisms
676
+ - Validation and buffering systems for telemetry data
677
+ - Schema validation for metric naming and resource attributes
678
+ - Four working SDK examples:
679
+ - Internal model instrumentation
680
+ - GenAI model integration
681
+ - Agentic AI workflows
682
+ - Vendor model integration
683
+ - Docker Compose orchestration for local development
684
+ - Integration helpers for vendor models, GenAI, and Python decorators
685
+ - Comprehensive test suite with unit and integration tests
686
+ - Support for Python 3.10, 3.11, and 3.12
687
+
688
+ ### Changed
689
+ - Buffering disabled by default for backward compatibility
690
+ - Improved demo scripts with better logging and metric handling
691
+ - Refactored metric names for consistency and clarity
692
+
693
+ ### Removed
694
+ - PHI detection and masking features (architectural decision to simplify initial release)
695
+
696
+ ### Fixed
697
+ - Buffering backward compatibility in `from_env()` configuration
698
+ - Critical `SecurityWarning` class placement in `MCAConfig`
699
+ - Multiple security and reliability issues identified in code review
700
+ - Test coverage expanded to meet 85% requirement
701
+
702
+ ### Security
703
+ - Security hardening for multi-source configuration system
704
+ - Registry token blocked from YAML configuration files to prevent credential exposure
705
+ - Localhost validation fixed to prevent substring attacks
706
+ - Comprehensive security review addressing CRITICAL and HIGH priority issues
707
+
708
+ [unreleased]: https://gitlab.com/bhsf/ai_ml/mca-sdk/compare/v0.8.0...HEAD
709
+ [0.8.0]: https://gitlab.com/bhsf/ai_ml/mca-sdk/releases/tag/v0.8.0
710
+ [0.1.0]: https://gitlab.com/bhsf/ai_ml/mca-sdk/releases/tag/v0.1.0