PitBridge
Join the waitlist

Twelve guardrails your AI agent cannot override

Every rule runs in the PitBridge daemon, outside the model. The agent proposes an order. The guardrail engine checks it against a config file the agent cannot read from or write to. Only a permitted order reaches NinjaTrader 8.

Rules the agent cannot talk its way around

Each card shows the rule name from the config schema and one example decision. The values are example configuration, chosen to look like plausible trader settings.

kill_switch

One command halts all order flow. Nothing passes until you re-arm it yourself, and re-arming is command line only.

BLOCK sell 1 RTY. kill_switch is armed.

daily_loss_halt

When the day ledger reaches your configured loss, new orders are refused until the next session.

BLOCK buy 1 ES. daily loss 512 >= limit 500.

profit_lock

Once the day is up by your target, further entries are refused so a good day is not given back.

BLOCK buy 1 NQ. profit 1420 >= lock 1400.

max_contracts_per_order

Caps contracts on a single order. An oversized order never reaches the platform.

BLOCK buy 5 MNQ. limit is 2.

max_position

Caps the net position per instrument and account. It counts the account's own working orders too, so two orders cannot race past the cap together.

BLOCK buy 2 MES. position would be 42 > max 40.

instruments

The agent trades only the instruments you listed. Everything else is refused.

BLOCK buy 1 6E. not in allowlist.

trading_window

Orders are accepted only inside your window, with a holiday and early-close calendar per account.

BLOCK buy 1 CL at 03:12. window is 09:30-16:00.

cooldown

Enforces a wait after a loss or after any order, so a looping agent cannot re-enter instantly.

BLOCK buy 1 MES. cooldown 4:11 left after loss.

max_orders

Caps orders per minute, hour and day so a runaway loop cannot spray the book.

BLOCK order 7 in 60s. limit is 6 per minute.

duplicate_order

Refuses the same account, instrument, side and size fired twice inside a short window.

BLOCK buy 2 MNQ. duplicate within 30s.

link_down

If the add-on link to NinjaTrader 8 is down, new orders hard-reject instead of queuing blind. The same freshness guard blocks new entries when an account's P&L feed goes stale, so the loss and profit halts never run on frozen data. De-risking stays allowed.

BLOCK buy 1 ES. addon link down for 18s.

human_confirm

Holds an order for your explicit approval. No approval inside the timeout means auto-reject.

WARN live order held. confirm within 60s.

What a guardrail is, and is not

A guardrail is a software control. It refuses an order that breaks a limit you set. That is the whole promise, stated plainly: PitBridge enforces the limits you configure. It does not create returns, it does not prevent every kind of loss, and it makes no claim about whether you keep or clear any account. A market can gap through a resting stop; a control that refuses new orders cannot change what an open position does next.

The engine is pure and deterministic. Given the same order, the same account state and the same clock, it returns the same decision every time: allow,block with a reason code, or require confirm. There is no model in the decision path, no network call, and no way to reconfigure a rule from inside a tool call. Changing a limit means editing the config file, which changes a checksum recorded in the audit log.

Two of these controls keep the engine honest about the data it reads. The position cap is in-flight-aware: max_position counts the account's own working orders alongside the filled position, so two concurrent orders cannot sum past the cap by racing. And when an account's account_state feed, the source of its unrealized profit and loss, goes stale past account_state_staleness_s (a [daemon] setting, default 60 seconds), new entries are refused with STALE_ACCOUNT_STATE so the daily loss halt and profit lock never run on frozen numbers. De-risking stays allowed.

Every block is auditable

Blocks are not silent. Each decision is appended to a hash-chained audit log, and you can ask the daemon why any order was refused.

pitbridge audit why
$ pitbridge audit why 01J8Z...MNQ
order        buy 8 MNQ  account=Sim101
decision     BLOCK
rule         max_contracts_per_order
detail       size 8 exceeds limit 2
config_hash  a1f3c9  (rules unchanged since 2026-07-05)

Example output with example configuration values.

You set the values

Limits live in a per-account config file. PitBridge does not ship your prop firm's numbers for you: you read your firm's rules and enter the values you intend to trade under. The engine then holds you to them.

guardrails.toml
# example account, example values
[accounts.eval]
nt_account = "Sim101"
mode       = "paper"   # read_only | paper | live

[accounts.eval.guardrails]
daily_loss_halt          = 500
profit_lock              = 1400
max_contracts_per_order  = 2
max_position             = 40
instruments              = ["MNQ 09-26", "MES 09-26"]
max_orders               = { per_minute = 6, per_hour = 20 }
cooldown_after_loss_s    = 300
duplicate_window_s       = 30
human_confirm            = "every_live_order"

Example configuration. See the docs for the full schema.

PitBridge is in development. NinjaTrader 8 is first.

Tell us your platform and we email you when your setup is supported. Nothing else.