@@ -111,6 +111,27 @@ class AutonetConfig:
111111 wallet_address : str = "" # Connected wallet address (empty = not connected)
112112
113113
114+ @dataclass
115+ class TraceLoggingConfig :
116+ """Configuration for structured agent trace logging.
117+
118+ Traces are written to ``trace_dir`` (default: ``{data_dir}/traces/``) as
119+ content-addressed JSON files and serve as training data for VL-JEPA.
120+
121+ Example config.yaml snippet::
122+
123+ trace_logging:
124+ enabled: true
125+ trace_dir: ~/.atn/traces # optional override
126+ include_user_data: false # set true to include orchestrator sessions
127+ min_turns: 1 # quality filter: skip near-empty sessions
128+ """
129+ enabled : bool = False
130+ trace_dir : str = "" # empty → {data_dir}/traces/
131+ include_user_data : bool = False # consent gate (Epic 3 Story 3.1)
132+ min_turns : int = 1 # minimum assistant turns for quality filter
133+
134+
114135@dataclass
115136class ATNConfig :
116137 """Top-level ATN configuration."""
@@ -119,6 +140,7 @@ class ATNConfig:
119140 orchestrator : OrchestratorConfig = field (default_factory = OrchestratorConfig )
120141 voice : VoiceConfig = field (default_factory = VoiceConfig )
121142 autonet : AutonetConfig = field (default_factory = AutonetConfig )
143+ trace_logging : TraceLoggingConfig = field (default_factory = TraceLoggingConfig )
122144 providers : dict [str , ProviderConfig ] = field (default_factory = dict )
123145 connectors : dict [str , ConnectorConfig ] = field (default_factory = dict )
124146 raw : dict [str , Any ] = field (default_factory = dict )
@@ -272,6 +294,16 @@ def load_config(path: Path | None = None) -> ATNConfig:
272294 wallet_address = resolved .get ("wallet_address" , "" ),
273295 )
274296
297+ # Trace logging
298+ trace_raw = raw .get ("trace_logging" , {})
299+ if isinstance (trace_raw , dict ):
300+ config .trace_logging = TraceLoggingConfig (
301+ enabled = trace_raw .get ("enabled" , False ),
302+ trace_dir = trace_raw .get ("trace_dir" , "" ),
303+ include_user_data = trace_raw .get ("include_user_data" , False ),
304+ min_turns = trace_raw .get ("min_turns" , 1 ),
305+ )
306+
275307 # Connectors
276308 for name , craw in raw .get ("connectors" , {}).items ():
277309 if not isinstance (craw , dict ):
0 commit comments