You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- Removed `create_ftra_node()` deprecated params (`registry_path`, `plan_key`) — kwargs no longer accepted; pass a `FtraNodeConfig` instance instead
50
59
- Removed `CONTROL_META`, `EVIDENCE_SLA_SECONDS`, `ISO_CONTROL_MAP` aliases — use region-aware accessors
51
60
- Removed `config/settings.py` module-level aliases — use `Config.X` class attributes
52
61
- Migrated threshold env vars to `config/governance_thresholds.json` (env vars still work as overrides)
53
62
- (CR-1) Removed Evidence Stream v1.0 schema support — v1.1 is now the only supported schema
54
63
- (CR-2) Removed NeMo auto-apply path (`NEMO_AUTO_APPLY_ENABLED`) — all refinements require human approval
55
64
- (CR-3) Renamed `update_state()` → `_update_state_unsafe()` — use `atomic_verify_and_commit()` instead
65
+
- Removed `AGWEnvelope`/`AGWEnvelopeBuilder` backward-compatibility aliases (`src/gateway/governance/agw_envelope.py`, entire file deleted) — use `GovernanceEnvelope`/`GovernanceEnvelopeBuilder` from `src/gateway/governance/governance_envelope.py`
66
+
- Removed `sign_archytan_digest()` method from `KMSSigner` (`src/gateway/governance/kms_signer.py`) — use `sign()` instead
56
67
57
68
### Added
58
69
-`config/governance_thresholds.json` v2.0.0 schema with FRIA, confidence, and causal thresholds
59
70
- Threshold accessor functions in `src/gateway/governance/schemas/thresholds.py`
60
71
- Region-aware control metadata accessors (`get_control_meta()`, `get_sla_seconds()`, `get_iso_control_map()`)
61
72
73
+
### Removed
74
+
-`src/gateway/governance/agw_envelope.py` (entire file) — `AGWEnvelope` and `AGWEnvelopeBuilder` backward-compatibility aliases; use `GovernanceEnvelope`/`GovernanceEnvelopeBuilder` from `src/gateway/governance/governance_envelope.py`
75
+
-`tests/test_agw_envelope.py` — backward-compatibility test suite for the removed `AGWEnvelope`/`AGWEnvelopeBuilder` aliases; see `tests/test_governance_envelope.py` for canonical coverage
76
+
-`sign_archytan_digest()` method from `KMSSigner` (`src/gateway/governance/kms_signer.py`) — use `sign()` instead
77
+
-`create_ftra_node()` deprecated `registry_path`/`plan_key` keyword arguments (`src/gateway/governance/ftra/node_factory.py`) — fully removed, not just deprecated; pass a `FtraNodeConfig` instance instead
78
+
62
79
### Changed
63
80
-`FtraNodeConfig` is now required for `create_ftra_node()` (no fallback extractors)
64
81
- Threshold values loaded from config file with env var overrides
65
82
-`SafetyBoundaryProtocol` no longer exposes `update_state()` method
66
83
84
+
### Fixed
85
+
-`KMS_BATCH_ENABLED` default-value discrepancy (Wave 0) resolved: confirmed default is `"false"` (disabled), matching `KmsBatchThresholds.enabled` in `src/gateway/governance/schemas/thresholds.py` and `config/governance_thresholds.json`. **Note:** the startup log comment in `src/compliance_bridge/main.py` (near line 213) still states the default is `"true"` and requires a follow-up code fix to align with the verified `"false"` default.
86
+
67
87
### Migration
68
88
See [MIGRATION_GUIDE_v3.md](docs/MIGRATION_GUIDE_v3.md) for detailed upgrade instructions.
69
89
90
+
Example migration for the `AGWEnvelope` removal:
91
+
92
+
```python
93
+
# Old (removed in v3.0.0):
94
+
from src.gateway.governance.agw_envelope import AGWEnvelope
95
+
96
+
# New (required):
97
+
from src.gateway.governance.governance_envelope import GovernanceEnvelope
|`src/gateway/governance/agw_envelope.py` (entire file — `AGWEnvelope`, `AGWEnvelopeBuilder` backward-compatibility aliases) |[`src/gateway/governance/governance_envelope.py`](../src/gateway/governance/governance_envelope.py) (`GovernanceEnvelope`, `GovernanceEnvelopeBuilder`) | Replace `from src.gateway.governance.agw_envelope import AGWEnvelope` with `from src.gateway.governance.governance_envelope import GovernanceEnvelope`; replace `AGWEnvelopeBuilder` with `GovernanceEnvelopeBuilder` (same module). `tests/test_agw_envelope.py` (the backward-compatibility test suite for these aliases) is also deleted — see [`tests/test_governance_envelope.py`](../tests/test_governance_envelope.py) for the canonical coverage. **(Completed post-tag, `fix/v3-breaking-changes-completion`.)**|
52
63
53
64
### Removed Classes/Functions
54
65
@@ -63,6 +74,7 @@ behavior change in `v3.0.0`.
63
74
|`EVIDENCE_SLA_SECONDS` (module-level dict alias) |[`src/compliance_bridge/types.py:446`](../src/compliance_bridge/types.py:446)|`get_sla_seconds(region)`| Replace direct dict access with `get_sla_seconds(region)`. Same universal-only → region-merged behavior note as `CONTROL_META` applies. |
64
75
|`ISO_CONTROL_MAP` (module-level dict alias — **two distinct symbols**) |[`src/compliance_bridge/types.py:512`](../src/compliance_bridge/types.py:512)**and**[`src/gateway/governance/ontology.py:197-234`](../src/gateway/governance/ontology.py:197) (`TradingKnowledgeGraph.ISO_CONTROL_MAP` class attribute) |`get_iso_control_map(region)` (types.py); `get_control_map(region)` (ontology.py) | These are **two unrelated symbols with the same name in two different modules** — migrate each independently. `src/compliance_bridge/types.py` callers use `get_iso_control_map(region)`; `TradingKnowledgeGraph` callers use `get_control_map(region)`. |
65
76
|`update_state()` (public API) |[`src/gateway/governance/cbf.py:907-998`](../src/gateway/governance/cbf.py:907)|`atomic_verify_and_commit()` (same module) |**Completed (CR-3)**: `update_state()` was renamed to `_update_state_unsafe()` (internal-only) to eliminate TOCTOU race conditions. External callers must call `atomic_verify_and_commit()`, which performs the CBF safety check and state commit atomically within a single Redis Lua execution. |
77
+
|`sign_archytan_digest()` (method) |[`src/gateway/governance/kms_signer.py`](../src/gateway/governance/kms_signer.py) (`KMSSigner` class) |`sign()` (same class) | Replace `kms_signer.sign_archytan_digest(digest)` with `kms_signer.sign(payload)`; `sign()` is the canonical signing entry point and covers the same code path. **(Completed post-tag, `fix/v3-breaking-changes-completion`.)**|
66
78
67
79
### Removed Endpoints
68
80
@@ -118,7 +130,7 @@ corresponding module is migrated; use the config file instead.
118
130
| Flag | New Behavior |
119
131
|------|--------------|
120
132
|`CAGE_DEFER_ENABLED`|**Not graduated in v3.0.0** (explicit recommendation in the cleanup plan §2.4). The flag remains, still defaulting to `"true"`. If your deployment currently sets this to `"false"` to force the DENY-fallback path, that behavior is **unchanged** in v3.0.0. This is a deliberate deviation from the "graduate stable flags" theme of this release — flagged here so consumers do not assume removal. |
121
-
|`KMS_BATCH_ENABLED`|**Status uncertain pending Wave 0 discrepancy resolution.**[`kms_batch_signer.py:75`](../src/compliance_bridge/kms_batch_signer.py:75) currently defaults this to `"true"`; [`main.py:211-212`](../src/compliance_bridge/main.py:211)'s comment claims the production default is `"false"`. **Do not assume this flag is graduated to any particular value until the CAGE release notes for your specific `v3.0.0` build confirm the resolved default.** If graduated, the flag is hardcoded and the `KMS_BATCH_ENABLED` env var (see above) is removed. |
133
+
|`KMS_BATCH_ENABLED`|**Resolved.** The Wave 0 discrepancy is closed: the confirmed default is `"false"` (disabled), matching [`KmsBatchThresholds.enabled`](../src/gateway/governance/schemas/thresholds.py:277) (`Field(default=False, ...)`) and [`config/governance_thresholds.json`](../config/governance_thresholds.json:56) (`"enabled": false`). The flag is **not graduated** — `KMS_BATCH_ENABLED` remains a valid env-var override of the config default via `get_kms_batch_enabled()`. **Known documentation debt (not yet code-fixed):** the startup comment at [`main.py:213`](../src/compliance_bridge/main.py:213) still incorrectly states "The signer is enabled by default (kms_batch.enabled=true..." — this comment is stale and requires a follow-up code change (out of scope for this documentation-only correction) to align with the verified `false` default. |
\"\"\"Return a JSON Web Key Set (JWKS) dictionary of all enabled keys.\"\"\"
62
+
from src.gateway.governance.jwks import pem_to_jwk
63
+
64
+
if not self._provider:
65
+
if self._public_key_pem:
66
+
jwk = pem_to_jwk(self._public_key_pem)
67
+
return {"keys": [jwk]}
68
+
return {"keys": []}
69
+
70
+
pems = self._provider.get_public_keys_pem()
71
+
keys = []
72
+
for pem in pems.values():
73
+
try:
74
+
keys.append(pem_to_jwk(pem))
75
+
except Exception:
76
+
pass
77
+
return {"keys": keys}
78
+
"""
79
+
content=re.sub(
80
+
r" def get_public_key_pem\(self\) -> bytes:\n if not self._public_key_pem:\n raise RuntimeError\(\"No public key is loaded.\"\)\n return self._public_key_pem\n",
0 commit comments