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-371beffa30151e5cbab1c0840b8b98db
At
2026-10-02 19:47 UTC
Decision id
—
Ruling id
371beffa30151e5cbab1c0840b8b98db0cb4131adb1f964ad627c58605e0092e
Outcome
—
Raw JSON
prot-371beffa30151e5cbab1c0840b8b98db.json

What the risk kernel ruled

It can only shrink, refuse or close.

Ruling
371beffa30151e5cbab1c0840b8b98db0cb4131adb1f964ad627c58605e0092e
At
2026-10-02 19:47 UTC
Answers
protective: weekend_freeze
Breaker
reduce_only → reduce_only
Guards applied
G1_venue_integrity, G2_weekend_freeze, G5_daily_kill, G10_breaker
instrumentheldaskedapprovedset by
COINUSDT-2.36%hold0 (flat)G2_weekend_freeze
HOODUSDT-2.44%hold0 (flat)G2_weekend_freeze

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": "50009.39148830000000000000000",
 "day_return": -0.0006784611030957654,
 "equity": "49975.46206138570000000000000",
 "kill_at": -0.015
}
G10 breakerfired—
no new exposure anywhere: breaker reduce-only (losing_streak)
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": "reduce_only",
 "book_trips": "losing_streak",
 "breaker_state": "reduce_only",
 "breaker_trips": "losing_streak",
 "consecutive_losses": 5.0,
 "drawdown": -0.0022233928560908803,
 "effective": "reduce_only",
 "llm_outage": false
}

COINUSDT: 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": "183.2416284593253515",
 "demo_index_move_bps_3h": 32.81690127423594,
 "demo_last": "183.01",
 "demo_live_gap_bps": 14.731558271497162,
 "demo_live_p99_bps": 165.0,
 "demo_mark": "183.23",
 "live_last": "183.28",
 "mark_index_gap": 6.345970303321497e-05,
 "mark_index_limit": 0.03,
 "session_open": true,
 "stale_index_min_move_bps_3h": 2.0
}
G2 weekend freezefiredexit
exit: pre-flatten: within 15 minutes of the weekend freeze
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": "preflatten"
}
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": "50009.39148830000000000000000",
 "day_return": -0.0006784611030957654,
 "equity": "49975.46206138570000000000000",
 "kill_at": -0.015
}
G10 breakerpassed2.36%
breaker reduce-only (losing_streak); this would refuse an increase, and none was requested
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": "reduce_only",
 "book_trips": "losing_streak",
 "breaker_state": "reduce_only",
 "breaker_trips": "losing_streak",
 "consecutive_losses": 5.0,
 "drawdown": -0.0022233928560908803,
 "effective": "reduce_only",
 "llm_outage": false,
 "quote_age_seconds": 10.842597,
 "snapshot_age_seconds": 222.233293
}

HOODUSDT: 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": "112.5826262060977345",
 "demo_index_move_bps_3h": 74.75862458836653,
 "demo_last": "112.61",
 "demo_live_gap_bps": 6.212282570110046,
 "demo_live_p99_bps": 383.0,
 "demo_mark": "112.58",
 "live_last": "112.68",
 "mark_index_gap": 2.3326921624006837e-05,
 "mark_index_limit": 0.03,
 "session_open": true,
 "stale_index_min_move_bps_3h": 2.0
}
G2 weekend freezefiredexit
exit: pre-flatten: within 15 minutes of the weekend freeze
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": "preflatten"
}
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": "50009.39148830000000000000000",
 "day_return": -0.0006784611030957654,
 "equity": "49975.46206138570000000000000",
 "kill_at": -0.015
}
G10 breakerpassed2.44%
breaker reduce-only (losing_streak); this would refuse an increase, and none was requested
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": "reduce_only",
 "book_trips": "losing_streak",
 "breaker_state": "reduce_only",
 "breaker_trips": "losing_streak",
 "consecutive_losses": 5.0,
 "drawdown": -0.0022233928560908803,
 "effective": "reduce_only",
 "llm_outage": false,
 "quote_age_seconds": 10.842597,
 "snapshot_age_seconds": 222.233293
}

What was sent and what came back

BUY 6.45 COINUSDTfilledprotective_exit
clientOid
sa15288dfa7a4fbdfd1f5d1769a16548
Venue orderId
1490003701307691008
Stop
—
Net P&L realised
+64.88 USDT
Dry-run preview (what Agent Hub would send)
order --action place --category USDT-FUTURES --symbol COINUSDT --side buy --orderType market --qty 6.45 --clientOid sa15288dfa7a4fbdfd1f5d1769a16548 --posSide short --paper-trading --dry-run
{
 "category": "USDT-FUTURES",
 "clientOid": "sa15288dfa7a4fbdfd1f5d1769a16548",
 "orderType": "market",
 "posSide": "short",
 "qty": "6.45",
 "side": "buy",
 "symbol": "COINUSDT"
}
exec idsideqtypricefeeopen/closeat
1490003701310664704buy6.45183.020.7082874—2026-10-02 19:48 UTC
BUY 10.83 HOODUSDTfilledprotective_exit
clientOid
sa8a4bde99f1e5a016c2f62e79577392
Venue orderId
1490003852822728704
Stop
—
Net P&L realised
+59.81 USDT
Dry-run preview (what Agent Hub would send)
order --action place --category USDT-FUTURES --symbol HOODUSDT --side buy --orderType market --qty 10.83 --clientOid sa8a4bde99f1e5a016c2f62e79577392 --posSide short --paper-trading --dry-run
{
 "category": "USDT-FUTURES",
 "clientOid": "sa8a4bde99f1e5a016c2f62e79577392",
 "orderType": "market",
 "posSide": "short",
 "qty": "10.83",
 "side": "buy",
 "symbol": "HOODUSDT"
}
exec idsideqtypricefeeopen/closeat
1490003852825702400buy10.83112.610.73173978—2026-10-02 19:48 UTC

Proof

Read from ledger rows 3549, 3550, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565 of ledger.jsonl; every blob those rows commit to is below, named by its SHA-256.