build(agent): molt-z#db0ec5 iteration
This commit is contained in:
parent
74e1d93590
commit
ec7a33d31f
|
|
@ -2,6 +2,10 @@
|
|||
|
||||
This repository contains a minimal, self-contained Python MVP for a privacy-preserving federated growth experimentation platform.
|
||||
|
||||
- New: DSL sketch and bridge for CatOpt-inspired federation primitives
|
||||
- opengrowth_privacy_preserving_federated_/dsl.py provides LocalExperiment, SharedSignal, and PlanDelta data models as a minimal DSL surface.
|
||||
- opengrowth_privacy_preserving_federated_/adapters/dsl_bridge.py offers a small bridge to convert local metrics via existing adapters (GA4Adapter, SegmentAdapter) into a canonical representation for federation.
|
||||
|
||||
- Exposes a lightweight API surface used by tests:
|
||||
- SchemaRegistry, ExperimentTemplate
|
||||
- SecureAggregator, CloudLedger, AccessControl, Governance
|
||||
|
|
|
|||
|
|
@ -0,0 +1,24 @@
|
|||
from typing import Dict, Any
|
||||
|
||||
from .ga4 import GA4Adapter
|
||||
from .segment import SegmentAdapter
|
||||
|
||||
|
||||
class DSLBridgeAdapter:
|
||||
"""A tiny bridge that translates local metrics into a canonical DSL-ready
|
||||
representation using a chosen adapter.
|
||||
|
||||
The bridge does not attempt to perform any privacy-preserving operations;
|
||||
it merely maps source metrics to the standard keys used by downstream
|
||||
federation components.
|
||||
"""
|
||||
|
||||
def __init__(self, adapter: object = None):
|
||||
self.adapter = adapter or GA4Adapter()
|
||||
|
||||
def fill(self, source_metrics: Dict[str, Any]) -> Dict[str, Any]:
|
||||
# Delegate to the provided adapter to normalize keys
|
||||
return self.adapter.fill(source_metrics)
|
||||
|
||||
|
||||
__all__ = ["DSLBridgeAdapter"]
|
||||
|
|
@ -0,0 +1,79 @@
|
|||
"""OpenGrowth DSL sketch for CatOpt-inspired federation primitives.
|
||||
|
||||
This module provides a lightweight, self-contained Domain-Specific Language
|
||||
sketch that models local experiments, exchanged signals, and incremental plan
|
||||
updates in a privacy-preserving federation setting.
|
||||
|
||||
The goal here is to give a minimal, type-annotated contract surface that can
|
||||
be extended by adapters and governance tooling without pulling in heavy
|
||||
dependencies.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import time
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Dict, Any
|
||||
|
||||
|
||||
@dataclass
|
||||
class LocalExperiment:
|
||||
"""Represents a locally-defined experiment on a single participant.
|
||||
|
||||
Attributes:
|
||||
id: Unique experiment identifier within the federation.
|
||||
variables: Local experiment parameters (e.g., price, funnel step).
|
||||
objectives: Desired outcome measures (e.g., maximize LTV, minimize CPA).
|
||||
privacy_budget: Optional per-experiment privacy constraints (DP budgets, data retention).
|
||||
"""
|
||||
|
||||
id: str
|
||||
variables: Dict[str, Any]
|
||||
objectives: Dict[str, Any]
|
||||
privacy_budget: Dict[str, Any] = field(default_factory=dict)
|
||||
created_at: float = field(default_factory=lambda: time.time())
|
||||
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
return {
|
||||
"id": self.id,
|
||||
"variables": self.variables,
|
||||
"objectives": self.objectives,
|
||||
"privacy_budget": self.privacy_budget,
|
||||
"created_at": self.created_at,
|
||||
}
|
||||
|
||||
|
||||
@dataclass
|
||||
class SharedSignal:
|
||||
"""Represents aggregated or shared signals exchanged between participants."""
|
||||
|
||||
experiment_id: str
|
||||
metrics: Dict[str, Any]
|
||||
timestamp: float = field(default_factory=lambda: time.time())
|
||||
metadata: Dict[str, Any] = field(default_factory=dict)
|
||||
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
return {
|
||||
"experiment_id": self.experiment_id,
|
||||
"metrics": self.metrics,
|
||||
"timestamp": self.timestamp,
|
||||
"metadata": self.metadata,
|
||||
}
|
||||
|
||||
|
||||
@dataclass
|
||||
class PlanDelta:
|
||||
"""Incremental update to an local plan or experiment outcome."""
|
||||
|
||||
experiment_id: str
|
||||
delta: Dict[str, Any]
|
||||
timestamp: float = field(default_factory=lambda: time.time())
|
||||
|
||||
def to_dict(self) -> Dict[str, Any]:
|
||||
return {
|
||||
"experiment_id": self.experiment_id,
|
||||
"delta": self.delta,
|
||||
"timestamp": self.timestamp,
|
||||
}
|
||||
|
||||
|
||||
__all__ = ["LocalExperiment", "SharedSignal", "PlanDelta"]
|
||||
Loading…
Reference in New Issue