t2-sentiment-agent

A Market Sentiment Agent for Bitget AI Base Camp S2, Track 2. Qwen decides; a risk kernel that can only reduce gates every order; Bitget's Agent Hub places paper orders on UTA Demo.

PAPER

← Back to the timeline

Protective ruling card

Card
prot-ab8fe11a77b5ed3d33d0be836d3126e2
At
2026-09-28 12:29 UTC
Decision id
—
Ruling id
ab8fe11a77b5ed3d33d0be836d3126e22b19b510988b5f765f81a493bf76e2eb
Outcome
—
Raw JSON
prot-ab8fe11a77b5ed3d33d0be836d3126e2.json

What the risk kernel ruled

It can only shrink, refuse or close.

Ruling
ab8fe11a77b5ed3d33d0be836d3126e22b19b510988b5f765f81a493bf76e2eb
At
2026-09-28 12:29 UTC
Answers
protective: venue_integrity
Breaker
active → active
Guards applied
G1_venue_integrity, G2_weekend_freeze, G5_daily_kill, G10_breaker
instrumentheldaskedapprovedset by
METAUSDT+2.49%hold0 (flat)G1_venue_integrity
MSTRUSDT+2.50%hold+2.50%as asked

Book-level guards

guardstatusceilingreason
G5 daily killpassed—
day return within the -1.5% kill
basis and inputs

Envelope simulation uses a -1.5% daily kill (envelope_clean.py)

{
 "day_open_equity": "49985.20616429",
 "day_return": -9.184175183575953e-05,
 "equity": "49980.61543539",
 "kill_at": -0.015
}
G10 breakerpassed—
breaker active; snapshot and quote fresh
basis and inputs

2.5% is past the worst no-edge 72h drawdown (-2.48%, envelope_clean.json); losing-streak and staleness rules ported from ARGUS risk/circuit.py (MIT); a model outage never leads to a deterministic trade (DESIGN.md §9.5); policy v2 (run2-a5): the losing-streak trip lapses, since a flat book in reduce-only could never close the winner that clears it; policy v2 (run2-a6): a flatten is itself a taker trade on every leg

{
 "book_demands": "active",
 "book_trips": "",
 "breaker_state": "active",
 "breaker_trips": "",
 "consecutive_losses": 0.0,
 "drawdown": -9.184175183575953e-05,
 "effective": "active",
 "llm_outage": false
}

METAUSDT: every guard

guardstatusceilingreason
G1 venue integrityfiredexit
exit: Demo last 726.41 is 74.6 bps from live 731.87, beyond the measured p99 of 67.2 bps
basis and inputs

Demo flash prints (BTCUSDT Demo mark 65.6% from its index, 2026-06-29 00:00 UTC); excursion counts and p99 gaps in demo_integrity.json and fade_demo.json; weekend Demo index moves 0.1-1.5 bps/h vs 18-66 bps/h on weekdays (weekend_vol.json)

{
 "demo_index": "731.3757961690688214",
 "demo_index_move_bps_3h": 42.65144529002026,
 "demo_last": "726.41",
 "demo_live_gap_bps": 74.60341317447087,
 "demo_live_p99_bps": 67.2,
 "demo_mark": "731.22",
 "live_last": "731.87",
 "mark_index_gap": 0.00021301794492636821,
 "mark_index_limit": 0.03,
 "session_open": true,
 "stale_index_min_move_bps_3h": 2.0
}
G2 weekend freezepassed—
outside the weekend freeze and its buffers
basis and inputs

UTA Demo does not track these perps on weekends. Mostly it freezes: weekend mean |1H move| of the Demo index 0.1-1.5 bps against 5.6-29.1 bps live (weekend_vol.json); MSTR +204 bps live vs +5 bps Demo from Saturday 00:00 to 12:00 UTC on 2026-09-19. Sometimes it jumps on its own: AAPL +80 bps Demo vs +17 bps live on 2026-09-12 (fade_demo2.txt); policy v2 (run2-a4): a trade still open when the record is scored has no result, so the window closes them all

{
 "asset_class": "us_equity",
 "phase": "open"
}
G5 daily killpassed—
day return within the -1.5% kill
basis and inputs

Envelope simulation uses a -1.5% daily kill (envelope_clean.py)

{
 "day_open_equity": "49985.20616429",
 "day_return": -9.184175183575953e-05,
 "equity": "49980.61543539",
 "kill_at": -0.015
}
G10 breakerpassed—
breaker active; snapshot and quote fresh
basis and inputs

2.5% is past the worst no-edge 72h drawdown (-2.48%, envelope_clean.json); losing-streak and staleness rules ported from ARGUS risk/circuit.py (MIT); a model outage never leads to a deterministic trade (DESIGN.md §9.5); policy v2 (run2-a5): the losing-streak trip lapses, since a flat book in reduce-only could never close the winner that clears it; policy v2 (run2-a6): a flatten is itself a taker trade on every leg

{
 "book_demands": "active",
 "book_trips": "",
 "breaker_state": "active",
 "breaker_trips": "",
 "consecutive_losses": 0.0,
 "drawdown": -9.184175183575953e-05,
 "effective": "active",
 "llm_outage": false,
 "quote_age_seconds": 1.976701,
 "snapshot_age_seconds": 285.723349
}

MSTRUSDT: every guard

guardstatusceilingreason
G1 venue integritypassed—
Demo mark within the index limit, Demo-live gap within p99, Demo index moving
basis and inputs

Demo flash prints (BTCUSDT Demo mark 65.6% from its index, 2026-06-29 00:00 UTC); excursion counts and p99 gaps in demo_integrity.json and fade_demo.json; weekend Demo index moves 0.1-1.5 bps/h vs 18-66 bps/h on weekdays (weekend_vol.json)

{
 "demo_index": "157.5647759154732033",
 "demo_index_move_bps_3h": 65.53892394562833,
 "demo_last": "157.35",
 "demo_live_gap_bps": 29.7807628944367,
 "demo_live_p99_bps": 316.2,
 "demo_mark": "157.53",
 "live_last": "157.82",
 "mark_index_gap": 0.00022070869121064912,
 "mark_index_limit": 0.03,
 "session_open": true,
 "stale_index_min_move_bps_3h": 2.0
}
G2 weekend freezepassed—
outside the weekend freeze and its buffers
basis and inputs

UTA Demo does not track these perps on weekends. Mostly it freezes: weekend mean |1H move| of the Demo index 0.1-1.5 bps against 5.6-29.1 bps live (weekend_vol.json); MSTR +204 bps live vs +5 bps Demo from Saturday 00:00 to 12:00 UTC on 2026-09-19. Sometimes it jumps on its own: AAPL +80 bps Demo vs +17 bps live on 2026-09-12 (fade_demo2.txt); policy v2 (run2-a4): a trade still open when the record is scored has no result, so the window closes them all

{
 "asset_class": "us_equity",
 "phase": "open"
}
G5 daily killpassed—
day return within the -1.5% kill
basis and inputs

Envelope simulation uses a -1.5% daily kill (envelope_clean.py)

{
 "day_open_equity": "49985.20616429",
 "day_return": -9.184175183575953e-05,
 "equity": "49980.61543539",
 "kill_at": -0.015
}
G10 breakerpassed—
breaker active; snapshot and quote fresh
basis and inputs

2.5% is past the worst no-edge 72h drawdown (-2.48%, envelope_clean.json); losing-streak and staleness rules ported from ARGUS risk/circuit.py (MIT); a model outage never leads to a deterministic trade (DESIGN.md §9.5); policy v2 (run2-a5): the losing-streak trip lapses, since a flat book in reduce-only could never close the winner that clears it; policy v2 (run2-a6): a flatten is itself a taker trade on every leg

{
 "book_demands": "active",
 "book_trips": "",
 "breaker_state": "active",
 "breaker_trips": "",
 "consecutive_losses": 0.0,
 "drawdown": -9.184175183575953e-05,
 "effective": "active",
 "llm_outage": false,
 "quote_age_seconds": 2.211701,
 "snapshot_age_seconds": 285.723349
}

What was sent and what came back

SELL 1.7 METAUSDTrejectedprotective_exit
clientOid
sa9b27313c223f9e1abd38c1ac420244
Venue orderId
not acknowledged
Stop
—
Net P&L realised
—
Dry-run preview (what Agent Hub would send)
order --action place --category USDT-FUTURES --symbol METAUSDT --side sell --orderType market --qty 1.7 --clientOid sa9b27313c223f9e1abd38c1ac420244 --posSide long --paper-trading --dry-run
{
 "category": "USDT-FUTURES",
 "clientOid": "sa9b27313c223f9e1abd38c1ac420244",
 "orderType": "market",
 "posSide": "long",
 "qty": "1.7",
 "side": "sell",
 "symbol": "METAUSDT"
}
exec idsideqtypricefeeopen/closeat
none

Proof

Read from ledger rows 788, 789, 790, 791, 792, 793, 794, 795 of ledger.jsonl; every blob those rows commit to is below, named by its SHA-256.