From 0c985a2ee6898138fddf536f435d8aca00b055f2 Mon Sep 17 00:00:00 2001 From: Anders Asheim Hennum Date: Mon, 13 Apr 2026 10:32:29 +0200 Subject: [PATCH 1/3] implement flags endpoint --- sdk_compliance_adapter/adapter.py | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/sdk_compliance_adapter/adapter.py b/sdk_compliance_adapter/adapter.py index 826a5383..e5267bc3 100644 --- a/sdk_compliance_adapter/adapter.py +++ b/sdk_compliance_adapter/adapter.py @@ -360,6 +360,46 @@ def get_state(): return jsonify({"error": str(e)}), 500 +@app.route("/get_feature_flag", methods=["POST"]) +def get_feature_flag(): + """Evaluate a feature flag""" + try: + if not state.client: + return jsonify({"error": "SDK not initialized"}), 400 + + data = request.json or {} + + key = data.get("key") + distinct_id = data.get("distinct_id") + person_properties = data.get("person_properties") + groups = data.get("groups") + group_properties = data.get("group_properties") + disable_geoip = data.get("disable_geoip") + force_remote = data.get("force_remote", False) + + if not key: + return jsonify({"error": "key is required"}), 400 + if not distinct_id: + return jsonify({"error": "distinct_id is required"}), 400 + + value = state.client.get_feature_flag( + key, + distinct_id, + person_properties=person_properties, + groups=groups, + group_properties=group_properties, + disable_geoip=disable_geoip, + only_evaluate_locally=not force_remote, + ) + + logger.info(f"Feature flag {key} for {distinct_id}: {value}") + + return jsonify({"success": True, "value": value}) + except Exception as e: + logger.exception("Error evaluating feature flag") + return jsonify({"error": str(e)}), 500 + + @app.route("/reset", methods=["POST"]) def reset(): """Reset SDK state""" From 8e02bd6ea93367065b97b093b21cffa40f90ad00 Mon Sep 17 00:00:00 2001 From: Anders Asheim Hennum Date: Mon, 13 Apr 2026 10:38:40 +0200 Subject: [PATCH 2/3] feat(compliance): declare capabilities in health endpoint The test harness reads capabilities from /health to determine which test suites to run. Without this field, all suites are skipped, resulting in 0/0 tests. Co-Authored-By: Claude Opus 4.6 (1M context) --- sdk_compliance_adapter/adapter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk_compliance_adapter/adapter.py b/sdk_compliance_adapter/adapter.py index e5267bc3..0d4007ba 100644 --- a/sdk_compliance_adapter/adapter.py +++ b/sdk_compliance_adapter/adapter.py @@ -196,6 +196,7 @@ def health(): "sdk_name": "posthog-python", "sdk_version": VERSION, "adapter_version": "1.0.0", + "capabilities": ["capture_v0", "encoding_gzip"], } ) From 72f4bde264f7125430cc6c466ebed7b1c1f84b2e Mon Sep 17 00:00:00 2001 From: Anders <754494+andehen@users.noreply.github.com> Date: Thu, 16 Apr 2026 12:47:43 +0200 Subject: [PATCH 3/3] Update sdk_compliance_adapter/adapter.py Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- sdk_compliance_adapter/adapter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk_compliance_adapter/adapter.py b/sdk_compliance_adapter/adapter.py index 0d4007ba..5ec29cff 100644 --- a/sdk_compliance_adapter/adapter.py +++ b/sdk_compliance_adapter/adapter.py @@ -376,7 +376,7 @@ def get_feature_flag(): groups = data.get("groups") group_properties = data.get("group_properties") disable_geoip = data.get("disable_geoip") - force_remote = data.get("force_remote", False) + force_remote = data.get("force_remote", True) if not key: return jsonify({"error": "key is required"}), 400