Changelog
Every change you can see, newest first. Additive changes never break a client that ignores unknown fields; breaking ones are announced before they ship.
- Additive
modifying a finished order is refused before the broker
PATCH /v1/orders/{order_id}on an order the order book already shows finished (filled, cancelled, rejected or expired) is now refused with the existingorder_not_open(409), as cancel already was; nothing is sent to the broker. Before, the modify was sent and the broker's answer returned (Pocketful answered HTTP 500, live 2026-10-05). The 409 is now listed for the operation, and theorder_not_opendescription names modify as well as cancel. No error code or enum value is added. - Additive
a waiting Pocketful stop-loss order is TRIGGER_PENDING
A Pocketful SL / SL-M order that has not triggered (nothing filled) is now reported
TRIGGER_PENDINGin order responses, webhooks and the stream, as other brokers report it; it wasOPEN. No value is added (TRIGGER_PENDINGalready exists). Internal: the broker conformance corpus gains Pocketful's first live trading replies (orders, fills, trades, cancels, modifies, GTTs, brackets and their errors), today's passes, and three error classes; the catalogue gains broker-agnostic checks from the run. - Additive
internal: conformance passes recorded per pack
No change for users (not in the API). Each broker pack gains
passes.json: the live runs that passed (run id, account, date), which credit their scenarios when a run records nothing new. Motilal Oswal 8, Tradejini 8 and Upstox 7 scenarios passed live today (read-only and exchange-shut). - Additive
internal: a leaked Tradejini recording revoked
No change for users (not in the API). A live-run recording that held an account record's values (tag, static IP, port, balance) is removed and lets a recording listed there (with a reason) be deleted, never edited.
- Additive
internal: Motilal Oswal order rows and stream frames recorded
No change for users (not in the API). Recordings from the Motilal Oswal
c.closed_placelive run: the order-book envelope witherrorcodeandmessage, its order rows (orderstatus"Error") and the stream's order-changed frames (orderstatus"SENT" and "ERROR"), now handled types. - Additive
internal: conformance catalogue and pack follow-ups
No change for users (not in the API).
r.stream_connectsalso passes on a stream the OMS reports up;c.closed_placealso passes when the broker accepts the order and then rejects it.c.amo_lifecycleis skipped for Motilal Oswal and Tradejini (no after-market orders yet). Motilal'sorderinitiatoridis redacted. Recordings of the passing Tradejinic.closed_placeand Upstoxr.stream_connectsruns. - Additive
internal: first live runs on Motilal Oswal, Tradejini and Upstox
No change for users (not in the API). Live-run accounts for Motilal Oswal (EBOM053637, full), Tradejini (HHS003, full) and Upstox (8BAMR3, read only); recordings from the read-only and market-closed runs; Tradejini stream packets PING (16), MARKET_STATUS (14) and EVENTS (15); Motilal's "ValuePlus Orders Not Allowed In This Session" (100048) classed
market_closed; Upstox's first account record, margins, holdings and stream authorisation. - Additive
internal: Motilal Oswal and Tradejini production replies recorded
No change for users (not in the API). The broker conformance corpus gains the first production replies from a Motilal Oswal and a Tradejini account (account records, empty and filled books, margins, stream acks and what we send on the streams), promoted from the unhandled list. Their expectations show three fixes: a Tradejini empty book is an empty answer (it was a refusal), Tradejini holdings are read (they were always empty) and Motilal position P&L uses the row's LTP without a live quote.
- Additive
internal: Paper account records recorded
No change for users (not in the API). The broker conformance corpus gains the two Paper account-record shapes production sees (session status
connectedandrefreshed), promoted from the unhandled list. - Additive
an order the broker says to "check order book" for is confirmed there
When a broker refuses an order but its text says the order may exist anyway (5paisa: "NEST Gateway timeout - please check order book"),
POST /v1/ordersnow reads the broker's order book for it (up to three reads, a few seconds) before answering. Listed: the slice isacceptedwith the broker's order id. Not listed:rejectedwith the broker's message, as before. Order book unreadable:unknown, settled from the order book like a timeout. No field, enum or status code is added. - Additive
internal: 5paisa's holiday order answer recorded
No change for users (not in the API). The broker conformance corpus gains 5paisa's answer to an order on a trading holiday ("NEST Gateway timeout - please check order book"), classed
outcome_unknown. - Additive
internal: 5paisa stream subscribe recorded
No change for users (not in the API). The broker conformance corpus gains what the OMS sends to subscribe to 5paisa's order stream, recorded live on 54183135.
- Additive
5paisa live order updates on every feed server
5paisa accounts whose login names a feed server other than A / B / C (seen: "O") now get live order updates on 5paisa's default feed host, as 5paisa's own SDK does. Before, they had none and relied on polling. No request, response or enum changes.
- Additive
5paisa accounts with no orders, positions or trades read as empty
A 5paisa account with an empty order book, positions or trade book now reads as empty. Before, 5paisa's "No Order found for this Client." / "No record found." / "No Trades found for this Client." answers made those reads fail and retry, so the account's books never refreshed. No request, response or enum changes. Internal: the broker conformance corpus gains 5paisa's first production replies (account record, empty books, holdings, margins).
- Additive
internal: Kite's stream refusal recorded
No change for users (not in the API). The broker conformance corpus gains Kite's 403 refusal of the order stream (the Kite Connect plan in use has none; the engine polls), as the pack already expected.
- Additive
internal: Kite after-market order lifecycle in the broker corpus
No change for users (not in the API). The broker conformance corpus gains a Kite after-market order placed, modified and cancelled live, Kite's refusals of such an order on the regular path (
order_not_found,invalid_field), itskt-omsgateway refusal (outcome_unknown), and Pocketful's holiday-rejected orders as its order book lists them. - Additive
Kite after-market orders can be modified and cancelled
PATCHandDELETE /v1/orders/{order_id}on a Zerodha order that Kite turned into an after-market order (placed while the market is shut) now reach it; before, Kite refused them ("Error parsing response (kt-oms)"). No request, response or enum changes. Internal (not in the API): the broker conformance corpus gains the Pocketful and Zerodha account records, first order refusals (Pocketful's trading-holiday refusal classedmarket_closed, Kite's circuit-band refusalinvalid_price_or_qty) and a stream ending. - Additive
internal: first production recordings in the broker corpus
No change for users (not in the API). The Pocketful and Zerodha replies production first met (empty books, real holdings rows, margins, socket subscribe / heartbeat / idle) join the conformance corpus, with the instruments their mappers resolve. Noren's
"no data"and Dhan'sDH-1111empty answers are classed as accepted. The rule that a filled order must carry an average price is dropped (the trade book prices it). - Additive
broker onboarding gate (off by default)
Behind
OMS_BROKER_GATE(off by default; when off nothing changes). When on, an account whose broker is not verified yet (its conformance pack is below stageproductionand not grandfathered; paper, Zerodha and Pocketful are verified) cannot open new exposure:POST /v1/ordersanswers that account's slicesrejectedwith reasonvalidation, andPATCH /v1/orders/{order_id}, bracket place / modify, GTT create / modify (/v1/orders/bracket,/v1/gtt) andPOST /v1/positions/convertanswer 422invalid_request(field: account). The message says the broker is not verified and its conformance stage. Nothing is sent to the broker. Reads, cancels, exits and square-offs are never refused. No error code, enum or wire value is added. - Additive
internal: broker conformance corpus and unhandled list
No change for users (not in the API). Broker conformance packs frozen statuses, redacted recordings and expectations) become contract files: recordings are append-only, the rest changes only with a
Contract-Change:trailer. cirrus-oms writes broker interactions it has not handled to Mongobroker_unhandled(one document per type: status, count, accounts, redacted sample), read by the watchdog and theconformancecommand. The account health hash gains abrokerfield. No error code, enum or wire value is added.