The agentic harness for
autonomous trading
Six primitives that give an LLM everything it needs to trade on your behalf — and nothing more than you've authorised.
Vibe Trade is a harness — a structured environment that lets a large language model reason about markets, act on your behalf, and accumulate judgement over time, without you having to babysit it.
The core insight is that LLMs are already capable of sophisticated market reasoning. What they lack is infrastructure: a live connection to the market, a sense of time, a memory that persists across sessions, a monitoring loop that doesn't cost a fortune, and a trust model that ensures nothing happens without your consent. Vibe Trade supplies all of it.
The result is a trading agent you can give a strategy to in plain English — and then leave alone.
What is Vibe Trade?
Vibe Trade is the backend for agentic trading. Just as infrastructure platforms give developers a database, auth, and storage without making them build those systems from scratch, Vibe Trade gives an AI trading agent a live market connection, a scheduling system, a strategy memory, an audit trail, a monitoring loop, and a permission gate — without you having to build any of it.
You describe what you want to trade and why. The agent figures out how. The harness makes sure it runs reliably, accountably, and only as far as you've permitted.
Live market awareness
20 built-in tools covering broker execution, real-time quotes, candles, indicators, fundamentals, ETFs, news, and index data. The agent never reasons from stale training data.
Strategy memory that persists
The agent doesn't start from zero each session. A written Playbook anchors every decision it makes — consistent rules, consistent judgement, isolated P&L.
Runs on its own schedule
Set a trigger once. The agent wakes itself up, reasons from live data, and acts — without you being present.
No trade without your consent
A code-level approval gate sits in front of every execution. You define what consent looks like at each level of autonomy.
The Harness
The word "harness" is deliberate. A harness doesn't replace the horse — it channels its capability into something controllable, directed, and safe. Vibe Trade does the same for an LLM.
An LLM on its own is powerful but directionless for trading. It has no state, no time, no broker connection, no memory of what it did yesterday, and no guardrails on what it can do next. The harness provides all of that as a set of interlocking primitives. Remove any one of them and the agent either can't act, or acts without accountability.
How Primitives Connect
The six primitives aren't independent modules — they compose into a single runtime loop. Here is the path for an autonomous Playbook run:
| Primitive | Role in the loop | Without it |
|---|---|---|
| Market Tooling | Gives the agent live data and the ability to execute | Agent reasons in the dark; can't act on the market |
| Heartbeat | Monitors conditions cheaply; wakes the agent only when something fires | Either runs 24/7 (expensive) or misses time-sensitive triggers |
| Triggers | Defines when and why the agent wakes up — time, price, or event | Agent runs once and is forgotten; nothing is automated |
| Permissions | Code-level gate before every trade; records every decision | Agent acts without consent; no audit trail |
| Playbooks | Loads the strategy document as context on every agent run | Every session starts from zero; no consistent identity or rules |
| Learnings | Logs every action with reasoning; compounds edge over time | Agent makes the same mistakes indefinitely; no accountability |
Vibe Trade App
A local chat interface and automation harness that puts all six primitives in your hands — the fastest way to understand what these docs describe in practice.
Vibe Trade is a fully-featured AI trading agent built on the harness described in this documentation. Every primitive — Heartbeat, Triggers, Permissions, Playbooks, Learnings — is wired up and running. Install it, connect your Dhan account, and the full harness is live.
It's designed as an experience first. Talk to the agent, watch it reason in real time, approve or reject its trade suggestions, create Playbooks through conversation, and inspect every decision and the reasoning behind it.
GitHub: vibetrade-ai/vibe-trade
Install and run
$ vibetrade ✓ VibeTrade running at http://localhost:3001 Click http://localhost:3001 if it doesn't open automatically
The browser opens automatically. Add your Anthropic API key and Dhan credentials at http://localhost:3001/settings.
The app runs entirely on your machine. Your API key, credentials, trade history, and Playbooks are stored in ~/.vibetrade/ and never leave your local environment.
What you can do with it
Talk to your portfolio
Ask the agent what's in your positions, how they're performing, what the market is doing. It has 20 live tools — real prices, candles, indicators, order book, news.
Create Playbooks in chat
Describe your strategy in plain English. The agent shapes it into a structured Playbook — entry rules, exit criteria, capital allocation, guardrails — then runs it autonomously.
Watch triggers fire
The Heartbeat loop runs in the background every 30 seconds. When a condition fires, you see it — and if it spawns a reasoning job, you see the agent's full thought process.
Approve trades in real time
Every trade recommendation arrives as a structured approval card with the exact order and every signal that led to it. One click to approve or reject.
Review the trade journal
Every decision, every reasoning trace, every outcome — logged and browsable by Playbook or time.
Configure without code
Triggers, Playbooks, and consent modes are all managed through the UI or through conversation.
Requirements
| Dependency | Notes |
|---|---|
| Node.js ≥ 20 | The app runs as a local Node process |
| Anthropic API key | Claude Sonnet for reasoning jobs, Haiku for condition evaluation |
| Dhan account | First supported broker — credentials added at /settings after install |
Start with chat before automation. The app is most useful as a live conversation partner first. Ask the agent to look at your positions, fetch a quote, or explain a stock's technicals. Once you're comfortable with how it reasons and what tools it has, give it a Playbook and let it run autonomously.
Market Tooling
The bridge between the LLM and the market — the agent never reasons from stale training data.
An LLM's training data has a cutoff. It doesn't know today's price of SBIN, whether Nifty is up or down, what news broke this morning, or what positions you currently hold. Market Tooling fixes this by giving the agent 20 built-in tools that connect it to live market data and your broker — so every decision it makes is grounded in what's actually happening right now.
Broker tools
Vibe Trade ships with first-class support for Dhan. Additional brokers are on the roadmap. The API endpoints, request structures, and parsing logic are already handled. The agent calls plain-English actions; the primitive handles the broker-specific implementation.
Why maintained integrations matter: Broker APIs change. Dhan moved from V1 to V2 — naive code generation, even from strong models, will sometimes call the wrong endpoint. Market Tooling maintains these integrations so tool calls don't silently fail.
| Tool | What it does | Approval required |
|---|---|---|
| get_quote | Live price for one or more NSE equities or ETFs | No |
| get_index_quote | Live price for any NSE index via IDX_I segment | No |
| get_positions | Current open positions with unrealised P&L | No |
| get_funds | Available margin and cash balance | No |
| get_orders | Pending and filled orders for the session | No |
| place_order | Place a buy or sell order — equity or ETF | Yes |
| cancel_order | Cancel a pending order by order ID | Yes |
Market data tools
| Tool | What it does |
|---|---|
| get_historical_data | OHLCV candles for equities, ETFs, and indices across any timeframe |
| compute_indicators | RSI, MACD, Bollinger Bands, SMA, EMA, ATR — computed from live OHLCV |
| get_fundamentals | P/E, EPS, market cap, revenue — stocks only, via Yahoo Finance |
| get_etf_info | Fund family, expense ratio, top 10 holdings, sector weights — ETFs only |
| fetch_news | Latest market news from LiveMint RSS |
| get_market_status | Whether the market is currently open or closed |
| is_trading_day | Whether a given date is an NSE trading day |
| get_upcoming_holidays | NSE holiday calendar |
| search_instruments | Search for equities or ETFs by name or symbol |
| get_top_movers | Top gainers and losers for any Nifty index |
| get_market_depth | Level 2 order book — bids and offers with quantities |
| get_index_constituents | All stocks in any NSE index with symbol, name, and industry |
| compare_stocks | Side-by-side comparison of equities or indices across key metrics |
Extensibility
The built-in tools cover the most common data needs, but every trader has their own edge — a proprietary screener, an internal backtesting engine, a Bloomberg terminal. Vibe Trade will support registering custom tools by defining an endpoint, credentials, and a capability description the agent can read.
Coming soon. Custom tool registration is on the roadmap. Once available, any data source or capability you can describe can be added to the agent's toolkit.
Heartbeat
Continuous market monitoring without continuous LLM inference — a lightweight loop that wakes the agent only when something matters.
Keeping an LLM running 24/7 is prohibitively expensive. But trading conditions don't wait — a stock might hit your entry price at 2:15pm on a Tuesday, and if nothing is watching, the moment passes. Heartbeat decouples monitoring from reasoning. A cheap process watches constantly. The LLM only runs when a condition fires.
The tick
Heartbeat runs on a fixed interval — every 30 seconds during market hours, slower when the market is closed. On each tick:
Build a dynamic snapshot
Fetch live prices for every symbol currently held and every symbol referenced in an active trigger. Not the whole market — just what's being watched. The scope adjusts automatically as your positions and triggers change.
Evaluate all active triggers
Check every trigger condition against the snapshot. Code conditions are evaluated in pure JavaScript — no LLM, no cost. LLM conditions are sent to a lightweight model (Haiku) with a single yes/no question.
Wake the agent — or stand down
If a condition fired: spin up the main agent with the full snapshot and Playbook context. If nothing fired: no LLM call, no cost. Quiet tick until the next interval.
Evaluation cost by condition type
| Condition mode | Evaluated by | Cost per tick | Example |
|---|---|---|---|
| code | Pure JavaScript | Near zero | quotes['HINDALCO'].lastPrice >= 964 |
| event | System event listener | Zero | position_opened, nifty_drop_percent |
| time | Cron scheduler | Zero | 20 9 * * 1-5 — weekdays at 9:20am |
| llm | Haiku (yes/no only) | Minimal | "Is any open position showing unusual movement relative to its average?" |
The llm condition mode is what makes Heartbeat qualitatively different from a traditional rules engine. The agent can set instinct-based triggers — not just coded equations — and the cost of monitoring them stays negligible.
Triggers
The automation primitive — every autonomous action the agent takes originates from a trigger.
A trigger is a condition and an action. When the condition becomes true, the action fires. There are no separate concepts called "schedules" or "reminders" — a cron expression is just a time-based condition, and everything resolves to the same two questions: when should this run? and what should happen when it does?
Anatomy of a trigger
Every trigger has the same shape. Here is a real stop-loss trigger from a live intraday session:
{
"id": "2da93e8b-59c1-4493-ab64-685840048aeb",
"name": "HINDALCO Short — Stop Loss ₹964",
"scope": "symbol",
"watchSymbols": ["HINDALCO"],
"condition": {
"mode": "code",
"expression": "quotes['HINDALCO'].lastPrice >= 964"
},
"action": {
"type": "hard_order", // executes instantly — no agent involved
"tradeArgs": {
"symbol": "HINDALCO",
"transaction_type": "BUY", // cover the short
"quantity": 3,
"order_type": "MARKET"
}
},
"expiresAt": "2026-03-11T15:15:00+05:30", // auto-cancels at EOD
"context": "Stop loss for intraday short. Entry SHORT 3 shares @ ₹957.95. Cover if price hits ₹964.",
"status": "active"
}
Condition modes
| Mode | When it fires | Typical use |
|---|---|---|
| code | When a JavaScript expression evaluates to true against the live snapshot | Stop-loss, price targets, portfolio-level drawdown guards |
| event | When a named system event occurs | Position opened/closed, Nifty move above threshold, re-entry scans |
| time | On a cron schedule | Morning scans, position monitors, EOD hard closes, EOD reviews |
| llm | When Haiku answers "yes" to a natural language question | Instinct-based conditions that can't be expressed as a formula |
Action types
| Type | What happens | Agent involved? | Typical use |
|---|---|---|---|
| hard_order | Trade executes immediately in pure code — no reasoning, no approval queue | No | Stop-losses, price targets, EOD hard closes where latency matters |
| reasoning_job | Agent wakes up with trigger context and Playbook loaded, reasons, and may queue approvals | Yes | Morning scans, position monitors, re-entry decisions, event-driven reviews |
hard_order vs reasoning_job: The distinction matters most for time-sensitive exits. A stop-loss that fires a reasoning_job will wait for the agent to wake up, reason, and queue an approval. A stop-loss that fires a hard_order executes the moment the price condition is met. For hard guardrails, use hard_order. For anything requiring judgement, use reasoning_job.
A real trigger stack — Aggressive Alpha
The full trigger architecture the agent registered for itself when running the Aggressive Alpha intraday Playbook — created automatically when positions were opened:
| Trigger | Condition | Action | Scope |
|---|---|---|---|
| Alpha SL — HINDALCO | code — price ≥ ₹964 (short SL) | hard_order BUY 3 MARKET | symbol |
| Alpha Target — HINDALCO | code — price ≤ ₹948 (target) | hard_order BUY 3 MARKET | symbol |
| Alpha Trail — HINDALCO | code — price ≤ ₹938 (+2% move) | reasoning_job — move SL to breakeven | symbol |
| Nifty Drop Guard | event — nifty_drop_percent ≥ 1% | reasoning_job — review all longs | market |
| Nifty Spike Guard | event — nifty_rise_percent ≥ 1% | reasoning_job — review all shorts | market |
| Re-entry Scanner | event — position_closed | reasoning_job — find next setup | portfolio |
| Correlated Drawdown Guard | code — 2+ positions losing >0.75% simultaneously | reasoning_job — review combined exposure | portfolio |
| Time Stop Review | code — any position <0.5% move after 90 min | reasoning_job — evaluate dead weight | portfolio |
| Position Monitor | time — every 30 min, 9:20am–3:10pm | reasoning_job — VWAP, RSI, volume check | portfolio |
| EOD Hard Close | time — 3:10pm daily | reasoning_job — close all positions | portfolio |
The agent registered all of these itself — from the per-position SL and target triggers to the portfolio-level guards. You described the strategy. The agent built the automation stack.
Permissions
The trust primitive — a code-level approval gate that ensures no money moves without recorded consent.
Giving an AI access to your trading account is a meaningful act of trust. The obvious failure mode is an agent that acts on your money without your knowledge. But there's a subtler failure mode: an agent that asks for permission in chat, you say "yes", and that's treated as authorisation. That's gameable, ambiguous, and not a real record of consent.
The core principle: no trade can be placed without explicit, recorded consent. What consent looks like depends on how much autonomy you've chosen to give the agent.
The approval gate
Every reasoning_job that wants to place a trade must submit a request to the approval gate. The agent cannot bypass this. Even when it has concluded a trade is the right move, it can only queue the request — not execute it.
The request arrives as a structured approval card: the exact trade, the full reasoning behind it, and the context that led to the decision. Here is a real card from a live session — the agent's recommendation to exit a short ONGC position:
SIGNAL 1 — RSI DETERIORATION: RSI has risen to 56.52, crossing the 55 ceiling for short momentum. The downside thesis is losing steam — buyers are stepping in.
SIGNAL 2 — RECOVERY WITH ELEVATED VOLUME: Last two candles (179K, 260K) showed high-volume bouncing action. Price recovering from ₹271.2 back to ₹271.75. A SHORT needs sellers in control; this shows the opposite.
SIGNAL 3 — POST-1PM LOSS WITH NO CATALYST: It is 13:30 IST. Position is at −1.02% with no news driving ONGC lower. Hard SL at ₹273.04 is only ₹1.29 away. Holding risks a −1.5% loss; exiting now limits damage to −1.02%.
RECOMMENDATION: Exit now. Saves approximately ₹5.30/share vs letting it hit the hard SL.
This is not a chat confirmation. It is a timestamped, structured record — linked to the Playbook, the trigger that fired, and the agent's reasoning at the moment of decision.
Three levels of consent
hard_order and the pre-authorisation model
Some triggers bypass the approval queue entirely. A hard_order trigger — used for stop-losses and price targets — executes the moment its condition is met, with no agent involvement and no approval step. This is by design: a stop-loss that waits for your phone tap is not a stop-loss.
The consent for a hard_order is given when you create the trigger. At that point you're specifying the exact condition and the exact trade. The execution is just the fulfilment of a decision you already made.
| Consent type | When given | Where recorded |
|---|---|---|
| Trade-level | At execution time — per trade | Approval queue — Approve / Reject |
| Trigger-level | When the hard_order trigger is created | Trigger record — condition + tradeArgs |
| Autonomous | When Playbook guardrails are defined | Playbook document — mandate boundaries |
Playbooks
The agent's operating manual — a written strategy document that anchors every decision made on its behalf.
Every new LLM session starts from zero. Without a Playbook, ask the agent whether to buy Infosys today, close the tab, ask again tomorrow — and you might get a different answer. One instance looks at volatility and says wait. Another looks at fundamentals and says buy. Neither is wrong, but neither is yours. There's no consistent thesis, no discipline, no record of what you were trying to achieve.
A Playbook is the document that fixes this. It is a written strategy that the agent receives as context on every run — whether triggered by a schedule, a price condition, or a live chat. The agent reasons as: "I am running this Playbook. These are my rules. Given what I can see right now, here is what I should do."
What a Playbook contains
A Playbook is a markdown document. There is no rigid schema — you write it the way you'd brief a portfolio manager. In practice, effective Playbooks cover four things:
| Section | What it captures | Example |
|---|---|---|
| Investment thesis | Why you're trading this and what you believe | "Maximize intraday P&L by keeping capital deployed across 3 slots, trading momentum/breakout setups on liquid Nifty 100 stocks in both directions" |
| Rules and constraints | What the agent must and must not do | "No new entries after 2:30 PM. Skip entry if available balance < ₹2,000. VIX > 22: use tighter SL parameters" |
| Entry and exit approach | How the agent identifies and sizes trades | "LONG: price above VWAP, RSI 45–65, breaking above opening range high. Quantity = slot capital / price, round down" |
| Capital allocation | How much is deployed and how it's split | "Slot A: ₹3,000 · Slot B: ₹3,000 · Slot C: ₹2,500 · Reserve: ₹500 (never deployed)" |
You don't write this from scratch. You describe your intent in plain English, the agent helps you shape it into a document, and once you agree — it becomes the operating manual.
What a Playbook adds
| Feature | |
|---|---|
| Consistent agent identity | Every trigger and schedule tied to this Playbook loads the same document. The agent always knows which programme it's running. |
| Isolated P&L tracking | Trades tagged to a Playbook are tracked separately. You can see exactly how a thesis is performing over time. |
| Capital allocation bounds | The Playbook specifies what's allocated. The agent reasons within those bounds and won't exceed them. |
| Playbook state | The agent reads and updates strategy state — scanning, paused, position_open — so each run picks up where the last one left off. |
| Scoped Learnings | Observations and distilled lessons are tagged to the Playbook they came from. Performance review is always in context of the specific thesis. |
Playbook record
The actual Playbook record for Aggressive Alpha — the live intraday strategy used throughout these docs:
{
"id": "84f56962-0f6b-4d71-b1ec-4c9721f88fdb",
"name": "Aggressive Alpha",
"description": "Aggressive intraday long/short momentum strategy trading up to 3 concurrent positions across Nifty 100 stocks, always keeping capital deployed.",
"allocation": 9000,
"state": "scanning", // updated by the agent after each run
"status": "active",
"plan": "## Aggressive Alpha — Intraday Long/Short Momentum Strategy\n\n...",
"createdAt": "2026-03-10T17:09:16.796Z",
"updatedAt": "2026-03-11T07:31:15.671Z"
}
Learnings
The agent's audit trail and compounding memory — an immutable record of every trade, every decision, and everything distilled from both.
LLMs don't naturally remember what they did. Ask an agent why it bought a stock last Tuesday and it may confabulate a reason, or simply not know. This is a foundational problem when AI is acting on your money: you need a ground truth it can't rewrite.
Beyond accountability, there's a compounding problem: without a record of what worked and what didn't, the agent makes the same mistakes indefinitely. Learnings solves both.
The trade journal
Every order placed through Vibe Trade is written to an immutable trade record. Each entry captures what happened, when, and — critically — why the agent decided to act. Here are real entries from a live session:
[
{
"id": "6b2029a0-81e1-443f-85cd-e9f377182391",
"symbol": "ONGC",
"transactionType": "SELL",
"quantity": 11,
"executedPrice": 269.00,
"status": "filled",
"strategyId": "84f56962-0f6b-4d71-b1ec-4c9721f88fdb",
"note": "Aggressive Alpha — Slot B SHORT. Below VWAP all session, RSI 45 falling, MACD negative, weak oil sector on bearish day. SL: ₹273.04, Target: ₹262.28",
"filledAt": "2026-03-11 10:19:12"
},
{
"id": "0c616b25-8f1b-4ea1-a2b8-4ddf3c4e0621",
"symbol": "COALINDIA",
"transactionType": "BUY",
"quantity": 5,
"executedPrice": 446.90,
"status": "filled",
"strategyId": "84f56962-0f6b-4d71-b1ec-4c9721f88fdb",
"note": "Aggressive Alpha — Slot C LONG. Gapped up at open, holding above VWAP, RSI 56 with room to run, MACD positive. SL: ₹440.00, Target: ₹457.77",
"filledAt": "2026-03-11 10:19:14"
}
]
The note field is written by the agent at the moment of entry — the reasoning it used to make the decision, not a post-hoc summary. Every trade is auditable back to the exact thesis the agent was running at the time.
Playbook-level vs. global
Every record is tagged. Trades, trigger runs, and observations are all linked to the Playbook they belong to — or marked global if they weren't part of one. The agent can filter its entire history by Playbook: show me everything Aggressive Alpha did.
Playbook-scoped
Did the strategy stay true to its rules? Where did it overtrade? Where did it miss entries? All answerable by filtering to the Playbook's history.
Global observations
Patterns that apply across all Playbooks — market-wide timing, instrument behaviour, model tendencies. Cross-strategy insights live here separately.
Compounding edge
At the end of each trading day, the agent reviews its history — reading through the trades placed, the reasoning written at the time, and the outcomes — and distils learnings from that review. These feed forward. A learning might propose tightening an entry condition, adjusting a rebalancing cadence, or flagging a pattern the agent kept getting wrong. Proposed changes require your approval; the agent does not edit the Playbook unilaterally.
End-of-day distillation is coming soon. The trade journal and audit trail are live today. The automated end-of-day review loop — where the agent reads its history and surfaces proposed learnings — is actively being built.
Skills
Reusable instruction modules that personalise how the agent behaves for specific tasks — loaded when relevant, ignored when not.
A Playbook defines what you're trying to achieve. A Skill defines how you like a specific recurring task done. Where a Playbook is the strategy, a Skill is the technique.
If you have a particular way of sizing positions, a checklist you run before entering a momentum trade, or a preference for how exit reasoning gets presented — that's a Skill. You write it once, and the agent reaches for it whenever that task comes up.
What a Skill looks like
A Skill is a markdown file: a name, a description the agent uses to decide when to reach for it, and the instruction content itself. The format is identical to Claude's skill files — intentionally familiar.
---
name: position-sizing
description: How I calculate position size for intraday trades. Use this
whenever you need to determine quantity for a new entry.
---
Always size by risk, not by capital.
1. Determine the stop-loss distance in rupees (entry price - SL price for longs)
2. Risk per trade = 1% of available capital
3. Quantity = risk per trade / stop-loss distance, rounded down
4. Minimum 1 share. If quantity rounds to 0, skip the trade.
5. Never exceed 25% of available capital in a single position, regardless
of what the formula gives you.
For intraday trades, always use INTRADAY product type. Never CNC.
How Skills are loaded
| Context | Which Skills are available |
|---|---|
| Live chat | All Skills in your library — the agent can reach for any of them freely |
| Playbook run (trigger or schedule) | Only Skills attached to that Playbook — clean isolation between strategies |
This mirrors how Skills work in Claude Code: you configure which Skills are available per project, and the model decides when they're relevant. Attach Skills to a Playbook the way you load Skills into a project.
Skills are coming soon. The Playbook context window already supports additional instruction modules. The Skills library UI and per-Playbook attachment are actively being built.
Primitives at a Glance
| # | Primitive | What it gives the agent | Without it |
|---|---|---|---|
| 01 | Market Tooling | Live data and broker execution — 20 built-in tools, never reasoning from stale training data | Agent reasons in the dark; can't act on the market |
| 02 | Heartbeat | Always-on monitoring loop that wakes the agent only when a condition fires | Either runs 24/7 at full cost, or misses time-sensitive triggers entirely |
| 03 | Triggers | A condition and an action — the automation primitive that drives everything | Agent runs once and is forgotten; nothing is automated |
| 04 | Permissions | A code-level approval gate with three consent modes and a full audit trail | Agent acts without authorisation; no record of why |
| 05 | Playbooks | A persistent strategy document loaded as context on every agent run | Every session starts from zero; no consistent identity or rules |
| 06 | Learnings | Immutable trade journal and compounding memory across every session | Agent makes the same mistakes indefinitely; no accountability |
| 07 | Skills | Reusable instruction modules for specific recurring tasks | Agent applies generic behaviour to tasks you've already taught it how to do |
Full Data Flow
How a complete autonomous Playbook run flows through all the primitives — from Heartbeat tick to executed trade. This is a real session: Aggressive Alpha, 11 March 2026.
*/30 9-15 * * 1-5.get_positions, get_quote, compute_indicators. Evaluates RSI deterioration, volume fade, post-1pm criteria across ONGC SHORT.place_order called: BUY 11 ONGC MARKET (close short). Order filled at ₹271.75. Order ID 341260311280802.The Position Monitor ran four times that day. At 9:30am it queued the ONGC exit, which was approved. At 10:00am it ran and took no action — logged as "no action needed." At 10:30am it queued exits for COALINDIA and HINDALCO. Every run, whether it resulted in a trade or not, is recorded in full.