EmotionFree Desk is a paper-trading Taskmaster agent. It proposes one action per cycle, then a deterministic risk gate is allowed to refuse that action. Gemini never places an order and cannot override the gate.
Inspiration Retail and “agentic” trading tools fail when the model is also the risk officer. After a losing day, the next prompt still sounds confident. EmotionFree Desk separates proposal from permission.
What it does
- Load policy.json (max daily loss 2%, max position 10%, max 5 names, allow_live false, mode paper).
- Read the current paper book.
- Gemini 3.5 Flash proposes exactly one JSON action: buy, sell, or hold.
- check_risk runs in process. If daily PnL is already at or past the cap, the decision is BLOCKED / max_daily_loss.
- The cycle is written to journal.jsonl.
Hackathon fixture used in the demo Book daily_pnl_pct = -2.4 against max_daily_loss_pct = 2.0. The agent may still propose. The gate blocks. That is the point.
Required stack
- Gemini 3.5 Flash via Gemini API (google-genai) and as the ADK agent model
- Google ADK: desk_agent/agent.py defines root_agent with tools get_policy, get_book, submit_intent
- Google Cloud Run (us-central1, min instances 0), Flask + gunicorn on PORT 8080
What is not in this project No live brokerage. No real money. allow_live is false.
Repo: https://github.com/MoniGula/EmotionFree-Desk Demo: https://www.youtube.com/watch?v=Ng0TtSt6uno
Log in or sign up for Devpost to join the conversation.