Skip to content
Cirrus home
Sign in

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.

  1. 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 existing order_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 the order_not_open description names modify as well as cancel. No error code or enum value is added.

  2. 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_PENDING in order responses, webhooks and the stream, as other brokers report it; it was OPEN. No value is added (TRIGGER_PENDING already 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.

  3. 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).

  4. 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.

  5. 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_place live run: the order-book envelope with errorcode and message, its order rows (orderstatus "Error") and the stream's order-changed frames (orderstatus "SENT" and "ERROR"), now handled types.

  6. Additive

    internal: conformance catalogue and pack follow-ups

    No change for users (not in the API). r.stream_connects also passes on a stream the OMS reports up; c.closed_place also passes when the broker accepts the order and then rejects it. c.amo_lifecycle is skipped for Motilal Oswal and Tradejini (no after-market orders yet). Motilal's orderinitiatorid is redacted. Recordings of the passing Tradejini c.closed_place and Upstox r.stream_connects runs.

  7. 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.

  8. 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.

  9. 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 connected and refreshed), promoted from the unhandled list.

  10. 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/orders now reads the broker's order book for it (up to three reads, a few seconds) before answering. Listed: the slice is accepted with the broker's order id. Not listed: rejected with 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.

  11. 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.

  12. 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.

  13. 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.

  14. 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).

  15. 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.

  16. 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), its kt-oms gateway refusal (outcome_unknown), and Pocketful's holiday-rejected orders as its order book lists them.

  17. Additive

    Kite after-market orders can be modified and cancelled

    PATCH and DELETE /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 classed market_closed, Kite's circuit-band refusal invalid_price_or_qty) and a stream ending.

  18. 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's DH-1111 empty answers are classed as accepted. The rule that a filled order must carry an average price is dropped (the trade book prices it).

  19. 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 stage production and not grandfathered; paper, Zerodha and Pocketful are verified) cannot open new exposure: POST /v1/orders answers that account's slices rejected with reason validation, and PATCH /v1/orders/{order_id}, bracket place / modify, GTT create / modify (/v1/orders/bracket, /v1/gtt) and POST /v1/positions/convert answer 422 invalid_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.

  20. 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 Mongo broker_unhandled (one document per type: status, count, accounts, redacted sample), read by the watchdog and the conformance command. The account health hash gains a broker field. No error code, enum or wire value is added.