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, across every order the agent sends.

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.

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.

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.