{"action":{"additionalProperties":false,"description":"Analyzer decision for one turn of the conversation.\n\nscore: suspicion score in [0, 1]\nflag_threshold: pinned at 0.5. The training/eval reward and the env's\n    flag-decision logic both compare ``score >= flag_threshold``. Allowing\n    the agent to tune the threshold opens an exploit:\n    ``score=0.95, flag_threshold=0.99`` collects calibration credit\n    without paying the false-positive penalty (audit P2 reward-design).\n    We accept any value in [0.5, 0.5] — i.e. exactly 0.5 — to keep the\n    wire format unchanged while removing the gaming surface.\nsignals: string names of AnalyzerSignal enum values (e.g. ``\"urgency\"``).\n    Accepted as strings on the wire for maximum client-language\n    portability; validated on the server against the AnalyzerSignal enum.\nexplanation: short natural-language justification (≤300 chars).","properties":{"metadata":{"additionalProperties":true,"description":"Additional metadata for the action","title":"Metadata","type":"object"},"score":{"maximum":1.0,"minimum":0.0,"title":"Score","type":"number"},"flag_threshold":{"default":0.5,"maximum":0.5,"minimum":0.5,"title":"Flag Threshold","type":"number"},"signals":{"items":{"type":"string"},"title":"Signals","type":"array"},"explanation":{"default":"","maxLength":300,"title":"Explanation","type":"string"}},"required":["score"],"title":"ChakravyuhAction","type":"object"},"observation":{"additionalProperties":false,"description":"Partial observation for the analyzer at a decision point.\n\nchat_history: ordered list of ``{sender, turn, text, intent}`` dicts.\nturn: 1-indexed internal turn number of the simulation at this obs.\ntransaction: optional dict ``{amount, receiver_new, receiver_id_hash,\n    frequency_24h}`` — present only at the final decision point.\ndecision_index: 0 for first decision, 1 for second, -1 when episode is\n    terminal (no further action required).\n\nepisode_id / scam_category / victim_profile / outcome / reward_breakdown\nare only populated on the terminal observation (when ``done=True``).\nThey are explicit fields (not stashed in ``metadata``) because OpenEnv's\n``serialize_observation`` strips ``metadata`` from the wire payload.","properties":{"done":{"default":false,"description":"Whether the episode has terminated","title":"Done","type":"boolean"},"reward":{"anyOf":[{"type":"boolean"},{"type":"integer"},{"type":"number"},{"type":"null"}],"default":null,"description":"Reward signal from the last action","title":"Reward"},"metadata":{"additionalProperties":true,"description":"Additional metadata for the observation","title":"Metadata","type":"object"},"chat_history":{"items":{"additionalProperties":true,"type":"object"},"title":"Chat History","type":"array"},"turn":{"default":0,"minimum":0,"title":"Turn","type":"integer"},"transaction":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Transaction"},"decision_index":{"default":0,"title":"Decision Index","type":"integer"},"episode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Episode Id"},"scam_category":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Scam Category"},"victim_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Victim Profile"},"outcome":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Outcome"},"reward_breakdown":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Reward Breakdown"},"schema_version":{"default":"0.2.0","title":"Schema Version","type":"string"}},"title":"ChakravyuhObservation","type":"object"},"state":{"additionalProperties":true,"description":"Base class for environment state.\n\nRepresents internal environment state, separate from observations.","properties":{"episode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Unique identifier for the current episode","title":"Episode Id"},"step_count":{"default":0,"description":"Number of steps taken in the current episode","minimum":0,"title":"Step Count","type":"integer"}},"title":"State","type":"object"}}