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

Overview

The paper book's numbers, computed from the hourly marks and closed trades in the ledger, beside what a book with no edge produced on the same venue.

Return
-0.030%
no-edge median -8.6 bps
Max drawdown
-0.037%
no-edge median -0.42%
Sharpe (annualised)
-8.33 ±11.2
70 hourly returns; descriptive
Win rate
0.0%
1 closed trade(s)
Decisions
13
1 act, 1 hold, 11 flat with reasons, 0 outage(s)
Orders
2 sent
2 planned, 2 fill(s)
Kernel
1 cut
decisions it reduced; 1 protective ruling(s)
Fees paid
2.99 USDT
turnover 0.100x

90% block-bootstrap intervals (descriptive, not inferential)

metricinterval
Max drawdown-0.067% to +0.000%
Sharpe (annualised)-12.56 to 3.34
Sortino (annualised)-15.33 to 6.09
Total return-0.058% to +0.008%

Three days of hourly marks cannot separate skill from luck: pure noise gives an annualised Sharpe standard error of about 11. The envelope is the pre-registered result of a no-edge book on the same venue (validation/demo_venue/envelope_clean.json, hashed into the genesis).

Ledger
1331 events, mode paper
Head hash
388255d7522689e64798e67ab839058a16e062a729a381a4ae14ea50cc406751
Exported
2026-09-27 18:37 UTC
Policy
policy-v1

Event → decision → execution

Every decision, abstention, model outage and protective ruling, in order. Each card shows what woke the agent, what it saw, what Qwen decided and why, what every guard ruled, the dry-run payload, the clientOid, the venue orderId, the fills, and the ledger rows that prove each line.

  1. 2026-09-25 00:01 UTC
    Event
    heartbeat funding BTCUSDT
    Decision
    flat with reasons Flat: several US equity perps show crowded long funding, but price stretches are insufficient and the main social cluster is coordinated promotion, so no position clears fees with confidence.
    Kernel → execution
    approved as asked
    no order
  2. 2026-09-25 08:01 UTC
    Event
    heartbeat funding BTCUSDT
    Decision
    flat with reasons Flat after a routine BTC funding heartbeat: funding is not extreme, taker flow is sell-skewed, open interest is falling, and US-session names show stretched prices without crowded-long funding to fad…
    Kernel → execution
    nothing to rule on
    no order
  3. 2026-09-25 13:32 UTC
    Event
    heartbeat us open SP500USDT,NDX100USDT,MSTRUSDT,HOODUSDT,CRCLUSDT,SNDKUSDT,COINUSDT,TSLAUSDT,GOOGLUSDT,METAUSDT,NVDAUSDT,AMZNUSDT,AAPLUSDT
    Decision
    flat with reasons Flat at the US open: funding z shows crowded longs in TSLAUSDT, HOODUSDT, MSTRUSDT and COINUSDT, but confirming positioning is missing, coordinated social stories look promotional, several Demo gaps/…
    Kernel → execution
    nothing to rule on
    no order
  4. 2026-09-25 16:04 UTC
    Event
    heartbeat funding BTCUSDT
    Decision
    flat with reasons Flat into the weekend: the best crowded-long fade candidates are US-session perps already inside the pre-freeze window, while BTCUSDT funding is mild and crowd text is promotional.
    Kernel → execution
    nothing to rule on
    no order
  5. 2026-09-26 00:02 UTC
    Event
    heartbeat funding BTCUSDT
    Decision
    flat with reasons Flat through the weekend freeze: US-session instruments cannot be opened for 47.9565 hours, and BTCUSDT funding and price facts show no crowded extreme worth fading. Promotional coordinated BTC chatt…
    Kernel → execution
    nothing to rule on
    no order
  6. 2026-09-26 08:01 UTC
    Event
    heartbeat funding BTCUSDT
    Decision
    flat with reasons Flat through the weekend freeze: BTCUSDT funding is mild and positioning confirmation is incomplete, while every US-session name is frozen and much of the crowd text is coordinated promotion. No edge…
    Kernel → execution
    nothing to rule on
    no order
  7. 2026-09-26 16:01 UTC
    Event
    heartbeat funding BTCUSDT
    Decision
    flat with reasons Flat into the weekend: US-session names are frozen and BTCUSDT funding is mildly negative without an extreme or positioning confirmation, so no trade clears the fee hurdle.
    Kernel → execution
    nothing to rule on
    no order
  8. 2026-09-26 17:27 UTC
    Event
    funding zscore BTCUSDT
    Decision
    flat with reasons Flat. BTCUSDT funding z-score sits at the extreme threshold (-2.00247) suggesting crowded shorts, but without corroborating positioning data (multiple sources failed) and with price showing no disloc…
    Kernel → execution
    nothing to rule on
    no order
  9. 2026-09-27 00:01 UTC
    Event
    heartbeat funding BTCUSDT
    Decision
    flat with reasons Flat: BTCUSDT funding is mildly negative but not extreme while price is stretched and key positioning sources failed; US-session instruments are weekend-frozen and many show stale Demo pricing, so no…
    Kernel → execution
    nothing to rule on
    no order
  10. 2026-09-27 08:02 UTC
    Event
    heartbeat funding BTCUSDT
    Decision
    flat with reasons Flat despite the BTC funding trigger: BTCUSDT.funding_z_live = -1.50066 is interesting but unconfirmed by failed positioning sources, price is stretched at BTCUSDT.ma20_distance_atr = 2.44375, and th…
    Kernel → execution
    nothing to rule on
    no order
  11. 2026-09-27 10:43 UTC
    Event
    funding zscore BTCUSDT
    Decision
    act BTCUSDT funding z-score of -2.00587 fired the extreme-short-crowding trigger. We go long 5% of equity to fade the crowded short, with invalidation if funding z returns above zero. All US-session inst…
    Kernel → execution
    approved as asked
    BUY 0.0294 BTCUSDT filled · 1488055070669295616
    Open the card · realised net -1.50 USDT
  12. 2026-09-27 14:47 UTC
    Event
    funding zscore BTCUSDT
    Decision
    hold Holding BTCUSDT long at full size. Funding z-score of -2.37635 shows deeply crowded shorts paying longs, supporting the position through funding income and squeeze risk. Social text is promotional no…
    Kernel → execution
    BTCUSDT +4.98% → +4.97% G6_turnover
    fired: G6_turnover
    no order
  13. 2026-09-27 15:06 UTC
    Event
    protective venue integrity
    Decision
    No model decision: the kernel acted on its own clock.
    Kernel → execution
    BTCUSDT +4.96% → 0 (flat) G1_venue_integrity
    fired: G1_venue_integrity
    SELL 0.0294 BTCUSDT filled · 1488120811372302336
    Open the card · realised net -13.26 USDT
  14. 2026-09-27 16:02 UTC
    Event
    heartbeat funding BTCUSDT
    Decision
    flat with reasons Stay flat: the circuit breaker is active, US-session names are frozen for the weekend, and BTCUSDT's negative funding z-score is not confirmed by positioning facts while crowd text is promotional.
    Kernel → execution
    nothing to rule on
    no order

Equity vs every arm

The governed book (bold) against flat, BTC held at our gross, a fixed-rule crowd fade with no language model, rival sentiment agents, the ungoverned twin, the live mirror, and the coin-flip null as a band.

-0.40%-0.20%+0.00%+0.20%09-24 17:0009-25 11:0009-26 05:0009-26 23:0009-27 17:00The agent, ungovernedThe agent, governed (replica)FlatBTC at our grossCrowd fade, fixed rulebaseline_coin_flip: median of 1000 seedsThe same fills on live pricesLexicon sentiment trader (with the crowd)Lexicon sentiment trader (against the crowd)Season-2 entry A: Fear & Greed with long/short confluenceSeason-2 entry B: sentiment and news signal fusionThe agent, governed
  • The agent, governed
  • The agent, ungoverned
  • The agent, governed (replica)
  • Flat
  • BTC at our gross
  • Crowd fade, fixed rule
  • baseline_coin_flip: median of 1000 seeds
  • The same fills on live prices
  • The legs the weekend freeze took away, on live
  • Lexicon sentiment trader (with the crowd)
  • Lexicon sentiment trader (against the crowd)
  • Season-2 entry A: Fear & Greed with long/short confluence
  • Season-2 entry B: sentiment and news signal fusion
  • baseline: baseline_coin_flip, 1000 seeds, 5-95%
armkindreturnSharpemax DDwin ratetrades
The agent, governed LLMours governed-0.030%-8.33-0.037%0.0%1
The agent, ungoverned LLMtwin ungoverned-0.028%-9.41-0.035%—0
The agent, governed (replica) LLMours governed-0.028%-9.41-0.035%—0
Flatbaseline+0.000%—0.000%—0
BTC at our grossbaseline-0.000%-0.35-0.005%—0
Crowd fade, fixed rulebaseline-0.083%-2.03-0.347%24.3%37
baseline coin flip: median of 1000 seedsbaseline-0.080%-5.22-0.205%33.3%9.0
The same fills on live prices LLMmirror live-0.030%-10.05-0.032%0.0%1
The legs the weekend freeze took away, on live LLMweekend counterfactual+0.000%—0.000%—0
Lexicon sentiment trader (with the crowd)rival-0.240%-7.17-0.469%42.9%14
Lexicon sentiment trader (against the crowd)rival+0.126%3.89-0.263%50.0%14
Season-2 entry A: Fear & Greed with long/short confluencerival+0.000%—0.000%—0
Season-2 entry B: sentiment and news signal fusionrival+0.000%—0.000%—0

Coin-flip null (1000 seeds on the same timestamps): total return 5th percentile -0.414%, median -0.080%, 95th +0.262%. The governed replica (costed exactly as the seeds are) beat 59.3% of seeds on return. Descriptive, not inferential.

Simulator check: the live Demo book returned -0.030% against the replica's -0.028%; over 2 of our fills the venue filled a median -2.51 bps worse than the cost model assumed (95th percentile -4.47 bps; positive is worse). Baselines are ranked against the replica, never the live book.

Baseline and rival arms run on the same decision timestamps and the same recorded snapshots, marked on the same Demo prices with the same costs, under the venue guards only, so the comparison isolates who decided. Full series and every arm's provenance: arms.json, arms_summary.json.

Guard funnel

What the risk kernel did to what Qwen asked for, guard by guard, and what reached Bitget.

What the model asked for

legs the model proposed
16
... asking to add exposure
2
approved in full
1
cut by the kernel
1
refused by the kernel
0

Exposure asked +5.01%, approved +5.00% (sum of absolute weight increases).

What reached the venue from model decisions

orders planned
1
previewed (dry run)
1
sent
1
acknowledged
1
filled
1
rejected / denied / unknown
0

Every guard, every ruling

guardbindingfirednot evaluatedpassedn/a
G1 venue integrity000160
G2 weekend freeze000133
G3 size000290
G4 stop000214
G5 daily kill000290
G6 turnover110150
G7 fee budget000290
G8 taker only000160
G9 grounding000214
G10 breaker000290
G11 eligibility000160

"Binding" counts the legs whose final weight that guard set. Every guard is evaluated on every ruling (none short-circuits); a missing input fails closed for any increase. The kernel can only shrink, refuse or close.

Protective rulings (1)

reasonrulings
venue integrity1

Governed vs ungoverned

The model's draft before the kernel, simulated on the same Demo marks and costs: what the kernel's interventions prevented and what they cost.

Intervention rate
7.7%
1 of 13 decisions
Prevented loss
+0.000%
equity fraction
Forgone gain
+0.000%
equity fraction
Ungoverned violation rate
6.2%
drafts that broke a guard
Max DD governed
-0.035%
ungoverned -0.035%
Human takeovers
0
owner triggers and amendments
decisionsymbolguardaskedapprovedP&L ungovernedP&L governed
dec-75c5f6aceb5dc679e04e719be49d42baBTCUSDTG6_turnover+4.98%+4.97%-0.007%-0.007%

Live mirror

The same book marked at Bitget's live prices beside the Demo marks, so a reader can see the Demo result is not a sandbox artefact.

-0.03%-0.02%-0.01%-0.00%+0.01%09-24 17:0009-25 11:0009-26 05:0009-26 23:0009-27 17:00book at the Demo marksame positions at live prices
  • book at the Demo mark
  • same positions at live prices

Largest hourly gap between the two: -0.1 bps. equity_live_mirror re-marks the open positions at live prices every hour and keeps the realised Demo P&L (book/marks.py); the mirror_live arm replays every fill on live prices (analysis/mirror.py)

armreturnmax DDhours
The same fills on live prices-0.030%-0.032%72
The legs the weekend freeze took away, on live+0.000%0.000%0

The weekend counterfactual holds, at live prices, exactly the equity legs the weekend-freeze guard took away while UTA Demo stops pricing them (Friday 20:00 to Monday 00:00 UTC): where S2's 7×24 theme shows up honestly on this venue.

Red team of the sentiment input

A sentiment agent reads text that attackers write. Published whatever the grade.

The red team has not been run for this export. It injects the HeyArka and AgentDojo attack strings and a coordinated pump into recorded snapshots and grades every arm against its clean decision (redteam/).

Bitget toolkit coverage

Every Bitget surface the agent touches: what it is used for, which judged line it serves, its last health (from the live probe or the ledger), and where it shows. Surfaces that were measured and are not used are listed with the reason.

surfaceusedused and OK nownot used, with reason
Agent Hub (bgc, pinned CLI)141114
Bitget public v3 market API752
bitget-signal (MCP)7018
bitget-mcp-server11157
GetAgent Playbook001
X (not Bitget)100
Reddit (not Bitget)100
upstream_direct100
Agent Hub (bgc, pinned CLI): 14 used, 14 not used
entryused for / judged linehealthvisible atnotes
order --action place --dry-run --paper-trading
the dry-run preview of every order: Agent Hub builds the exact request (wouldSend) with no network call, the preview is logged, and the order is sent only if it matches the approved intent
Agent architecture quality / the Track 2 execution layer the handbook names: Agent Hub with --paper-trading produces the paper-trading log (handbook:422, :444)
ok
2026-09-27 15:06 UTC
decision card: orders (dry-run payload, clientOid, venue orderId, fills)in the log: 2 dry-run preview(s) logged
order --action place --paper-trading
every order: market (taker) only, with a preset stop on every exposure-adding leg, reduce-only on every reducing leg, clientOid derived from the approved intent
Agent architecture quality / the Track 2 execution layer the handbook names: Agent Hub with --paper-trading produces the paper-trading log (handbook:422, :444)
ok
2026-09-27 15:06 UTC
decision card: orders (dry-run payload, clientOid, venue orderId, fills)in the log: 2 acknowledged, 0 rejected, 0 unknown
order --action detail --paper-trading
the order read back by clientOid (or orderId) until it is terminal; resolves an UNKNOWN send without ever resending it
Agent architecture quality / the Track 2 execution layer the handbook names: Agent Hub with --paper-trading produces the paper-trading log (handbook:422, :444)
ok
2026-09-27 15:06 UTC
decision card: orders (dry-run payload, clientOid, venue orderId, fills)in the log: 2 order state(s) read back from the venue
order --action fills --paper-trading
fills: execution price, quantity, fee and realised P&L as the venue reports them; the book is built from these alone
paper trading Sharpe, max drawdown, win rate: the hourly equity marks
ok
2026-09-27 15:06 UTC
decision card: orders (dry-run payload, clientOid, venue orderId, fills)in the log: 2 fill(s) read
order --action history --paper-trading
the daily full order history, so an order the agent did not see acknowledged is still found and reconciled
Agent architecture quality / the Track 2 execution layer the handbook names: Agent Hub with --paper-trading produces the paper-trading log (handbook:422, :444)
ok
2026-09-27 17:13 UTC
decision card: orders (dry-run payload, clientOid, venue orderId, fills)in the log: 269 reconciliation(s); latest found 0 discrepancy(ies)
position --action info --paper-trading
the venue's own positions, compared with the book built from fills; every difference is a logged discrepancy
risk control layer effectiveness: an input the kernel rules on
ok
2026-09-27 17:13 UTC
decision card: orders (dry-run payload, clientOid, venue orderId, fills)in the log: 269 reconciliation(s); latest found 0 discrepancy(ies)
strategy_order --action open --paper-trading
the venue's open stop orders (type tpsl), so every position has exactly one stop (G4)
risk control layer effectiveness: an input the kernel rules on
ok
2026-09-27 17:13 UTC
decision card: kernel ruling, per guardin the log: 269 reconciliation(s); latest found 0 discrepancy(ies)
strategy_order --action place --paper-trading
a full-position stop, triggered on the Demo mark, placed or replaced after a fill changes a position (G4: a stop on the venue survives a crashed agent)
risk control layer effectiveness: an input the kernel rules on
not measureddecision card: kernel ruling, per guard
strategy_order --action cancel --paper-trading
cancels an orphaned or superseded stop, only after its replacement is in place
risk control layer effectiveness: an input the kernel rules on
not measureddecision card: kernel ruling, per guard
account_overview --paper-trading
the Demo account in one read: the environment proof's Demo-positive check, the hold mode, the starting equity and the venue equity published beside the book's
hard safety rule: orders only ever reach Bitget's Demo environment (DESIGN.md §2, §11.2)
ok
2026-09-27 17:13 UTC
demo page: environment proofin the log: environment proof: Demo read ok=True (code 00000)
funds_records --action financial --paper-trading
funding payments the venue booked on the account, read every sweep and written as funding events, so the book's equity and each trade's net P&L carry them (run2-d6); whether Demo books funding at all is shown by whether any appear
paper trading Sharpe, max drawdown, win rate: the hourly equity marks
not measureddemo page: equity against every arm
raw --operationId getAccountAssets --paper-trading
the same account read as one operation, so a refusal keeps its error code: a 40099 here means the key is not a Demo key, and the agent exits
hard safety rule: orders only ever reach Bitget's Demo environment (DESIGN.md §2, §11.2)
ok
2026-09-27 17:13 UTC
demo page: environment proofin the log: environment proof: Demo read ok=True (code 00000)
raw --operationId getAccountAssets --read-only
the environment proof's live-negative read: the Demo key must be refused by the live environment. The only argv without --paper-trading, and --read-only makes bgc refuse any write before the network (agent-sdk safety.ts:90-95)
hard safety rule: orders only ever reach Bitget's Demo environment (DESIGN.md §2, §11.2)
ok
2026-09-27 17:13 UTC
demo page: environment proofin the log: environment proof: the live environment refused the Demo key=True (code 40099) (a refusal is the expected answer)
flag --paper-trading
routes every call to Bitget's Demo environment (sends paptrading: 1 on private calls, agent-sdk rest-client.ts:274-280); the argv builder appends it as a constant and the environment proof re-reads the installed SDK source to confirm it
hard safety rule: orders only ever reach Bitget's Demo environment (DESIGN.md §2, §11.2)
ok
2026-09-27 17:13 UTC
demo page: environment proofin the log: installed SDK sends paptrading: 1 = True

Not used (14), each with its reason

entryreasonmeasured
marketnot used: the same public v3 endpoints are read directly over HTTPS, keyless, with every raw response stored as a blob; a child process per read would add nothing the log needsnot measured
account_confignot used: the agent reads the hold mode (account_overview) and never changes account settings; sizing is by notional against equity, not by leveragenot measured
transfer_fundsnot used: a paper book moves no fundsnot measured
depositnot used: a paper book moves no fundsnot measured
withdrawnot used: a paper book moves no funds, and the Demo key is created without the Withdraw permission (DESIGN.md §21)not measured
repaymentnot used: no margin loan is takennot measured
subaccountnot used: one Demo account, no sub-accountsnot measured
brokernot used: not a broker integrationnot measured
loannot used: no loan is takennot measured
inst_loannot used: no loan is takennot measured
taxnot used: outside the trading loopnot measured
discovernot used: every argv is fixed in execution/bgc.py and checked against recorded dry-run output of the pinned 3.0.0 CLI; nothing is discovered at run timenot measured
bitget-agent-mcp (the same SDK over MCP)not used: the CLI's argv is logged verbatim beside each order and pinned by the lockfile; the MCP server drives the same SDK operations with nothing to add for an unattended loopnot measured
Agentic account (OAuth, bitget-agent-mcp)not used: Track 2 runs on a Demo API key; the Agentic account trades live funds (win plan §3.6, the owner's decision alone)not measured
Bitget public v3 market API: 7 used, 2 not used
entryused for / judged linehealthvisible atnotes
GET /api/v3/market/tickers (Demo, header paptrading: 1)
Demo last, mark, index, bid and ask: the venue the orders go to. Marks the book every hour, fills the simulated venue, and feeds the venue-integrity (G1), spread (G8) and staleness (G10) checks
risk control layer effectiveness: an input the kernel rules on
ok
2026-09-27 17:10 UTC
decision card: kernel ruling, per guardin the log: newest snapshot, 15 call(s): ok 15
GET /api/v3/market/tickers (live)
Live last, mark, funding and open interest: the real crowd's positioning (DESIGN.md §6.1), the Demo-live gap G1 checks, and the live price of every open position in the hourly mirror
decision explainability: shown to the model and on the decision card
ok
2026-09-27 17:10 UTC
decision card: positioning tablein the log: newest snapshot, 15 call(s): ok 15
GET /api/v3/market/instruments (Demo, header paptrading: 1)
Demo order limits and fees (minOrderQty, quantityMultiplier, priceMultiplier, minOrderAmount, maxMarketOrderQty, takerFeeRate): eligibility (G11), rounding, splits and the expected fee of every order
risk control layer effectiveness: an input the kernel rules on
not measureddecision card: orders (dry-run payload, clientOid, venue orderId, fills)
GET /api/v3/market/history-candles type=market interval=1H (live)
Live hourly closes: the overheating feature (distance from the 20-bar mean in ATR units) and the prices the live mirror and the weekend counterfactual are marked at
decision explainability: shown to the model and on the decision card
ok
2026-09-27 17:10 UTC
demo page: live-marked mirrorin the log: newest snapshot, 28 call(s): ok 28
GET /api/v3/market/history-candles type=index interval=1H (Demo, header paptrading: 1)
Demo index closes: the stale-index detector that refuses new exposure when the Demo index stops moving while its session should be open (G1)
risk control layer effectiveness: an input the kernel rules on
ok
2026-09-27 17:10 UTC
decision card: kernel ruling, per guardin the log: newest snapshot, 28 call(s): ok 28
GET /api/v3/market/history-candles type=mark interval=1H (Demo, header paptrading: 1)
Demo hourly marks: the prices the twin, the fixed-rule baselines and the rival arms are simulated and marked at, so every arm is read on the book's own venue
paper trading Sharpe, max drawdown, win rate: the hourly equity marks
not measureddemo page: equity against every arm
GET /api/v3/market/history-fund-rate (live)
Live funding history: the funding z-score over the last 90 settlements, shown to the model and the funding event trigger
decision explainability: shown to the model and on the decision card
ok
2026-09-27 17:10 UTC
decision card: positioning tablein the log: newest snapshot, 28 call(s): ok 28

Not used (2), each with its reason

entryreasonmeasured
GET /api/v3/market/instruments (live)not used: orders go to Demo, so Demo's limits and fees are the ones that bind; the live limits were measured once for the design (validation/demo_venue/universe_probe.json)not measured
GET /api/v3/market/history-fund-rate (Demo, header paptrading: 1)not used: Demo funding is a sandbox setting, not a crowd: SBTCSPERP fixed at -0.10% on 270 of 270 settlements and BTCPERP at the +30 bps cap (DESIGN.md §6.1)not measured
bitget-signal (MCP): 7 used, 18 not used
entryused for / judged linehealthvisible atnotes
sentiment_index.current
crypto Fear & Greed from the second service: agreement check, stand-in for the primary
decision explainability: the value is shown to the model and on the decision card
hollow
2026-09-27 17:10 UTC
decision card: mood and source agreementSkill: sentiment-analyst; 1 call(s): hollow 1; not ok: -=hollow; e.g. upstream error envelope {"alt_me_error": ""}; in the log: newest snapshot, 1 call(s): hollow 1; not ok: -=hollow; e.g. upstream error envelope {"alt_me_error": ""}
derivatives_sentiment.long_short
retail long/short when bitget-mcp-server has none
Agent architecture quality: the Track 2 perception layer the handbook names (bitget-signal + bitget-mcp-server)
hollow
2026-09-27 17:10 UTC
toolkit coverage matrixSkill: sentiment-analyst (also market-intel, news-briefing); 14 call(s): hollow 14; not ok: BTCUSDT=hollow, SP500USDT=hollow, NDX100USDT=hollow, MSTRUSDT=hollow, HOODUSDT=hollow, CRCLUSDT=hollow, SNDKUSDT=hollow, COINUSDT=hollow, TSLAUSDT=hollow, GOOGLUSDT=ho…
derivatives_sentiment.top_ls
top-trader long/short when bitget-mcp-server has none
Agent architecture quality: the Track 2 perception layer the handbook names (bitget-signal + bitget-mcp-server)
hollow
2026-09-27 17:10 UTC
toolkit coverage matrixSkill: sentiment-analyst (also market-intel, news-briefing); 14 call(s): hollow 14; not ok: BTCUSDT=hollow, SP500USDT=hollow, NDX100USDT=hollow, MSTRUSDT=hollow, HOODUSDT=hollow, CRCLUSDT=hollow, SNDKUSDT=hollow, COINUSDT=hollow, TSLAUSDT=hollow, GOOGLUSDT=ho…
derivatives_sentiment.taker_ratio
taker ratio when bitget-mcp-server has none
Agent architecture quality: the Track 2 perception layer the handbook names (bitget-signal + bitget-mcp-server)
hollow
2026-09-27 17:10 UTC
toolkit coverage matrixSkill: sentiment-analyst (also market-intel, news-briefing); 14 call(s): hollow 14; not ok: BTCUSDT=hollow, SP500USDT=hollow, NDX100USDT=hollow, MSTRUSDT=hollow, HOODUSDT=hollow, CRCLUSDT=hollow, SNDKUSDT=hollow, COINUSDT=hollow, TSLAUSDT=hollow, GOOGLUSDT=ho…
derivatives_sentiment.open_interest
open-interest series when bitget-mcp-server has none (taken whole, never spliced)
Agent architecture quality: the Track 2 perception layer the handbook names (bitget-signal + bitget-mcp-server)
hollow
2026-09-27 17:10 UTC
toolkit coverage matrixSkill: sentiment-analyst (also market-intel, news-briefing); 14 call(s): hollow 14; not ok: BTCUSDT=hollow, SP500USDT=hollow, NDX100USDT=hollow, MSTRUSDT=hollow, HOODUSDT=hollow, CRCLUSDT=hollow, SNDKUSDT=hollow, COINUSDT=hollow, TSLAUSDT=hollow, GOOGLUSDT=ho…
derivatives_sentiment.reddit_trending
Reddit attention ranking (crypto and stocks), screened as crowd text
decision explainability: the value is shown to the model and on the decision card
hollow
2026-09-26 17:12 UTC
decision card: text shown to the modelSkill: sentiment-analyst (also market-intel, news-briefing); 2 call(s): hollow 2; not ok: all-crypto=hollow, all-stocks=hollow; e.g. upstream error envelope {"error": ""}
news_feed.latest
news headlines, screened as crowd text
decision explainability: the value is shown to the model and on the decision card
hollow
2026-09-26 17:12 UTC
decision card: text shown to the modelSkill: news-briefing (also market-intel); 1 call(s): hollow 1; not ok: -=hollow; e.g. answered with a hollow payload (every value empty, zero or an error)

Not used (18), each with its reason

entryreasonmeasured
technical_analysis.rsinot used: indicators are computed from Bitget's own candles (ARGUS measured this tool's MACD signal and histogram fields swapped); Skill: technical-analysis; not used: indicators are computed from Bitget's own candles (ARGUS measured this tool's MACD signal and histogram fields swapped); measured ok (1 rows)ok
crypto_market.globalnot used: prices come from Bitget's own public v3 API, the venue orders go to; Skill: market-intel; not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: tool reported an error: Error executing tool crypto_market: ConnectTimeout('')error
crypto_price.pricenot used: prices come from Bitget's own public v3 API, the venue orders go to; Skill: none of the five names this tool; not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: tool reported an error: Error executing tool crypto_price: ConnectTimeout('')error
crypto_derivatives.ticker_24hnot used: prices come from Bitget's own public v3 API, the venue orders go to; Skill: none of the five names this tool; not used: prices come from Bitget's own public v3 API, the venue orders go to; measured ok (1 rows)ok
global_assets.pricenot used: prices come from Bitget's own public v3 API, the venue orders go to; Skill: macro-analyst; not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: tool reported an error: Error executing tool global_assets:error
macro_indicators.latest_releasenot used: not a pre-registered input of policy v1; Skill: macro-analyst; not used: not a pre-registered input of policy v1; measured hollow: upstream error envelope {"error": ""}hollow
rates_yields.yield_curvenot used: not a pre-registered input of policy v1; Skill: macro-analyst; not used: not a pre-registered input of policy v1; measured hollow: answered with a hollow payload (every value empty, zero or an error)hollow
cross_asset.correlationnot used: not a pre-registered input of policy v1; Skill: macro-analyst; not used: not a pre-registered input of policy v1; measured error: tool reported an error: Error executing tool cross_asset:error
tradfi_news.earningsnot used: its description says it needs a Finnhub key; earnings come from bitget-mcp-server; Skill: news-briefing, macro-analyst; not used: its description says it needs a Finnhub key; earnings come from bitget-mcp-server; measured hollow: upstream error envelope {"error": ""}hollow
social_trending.trendingnot used: Chinese hot lists name no universe instrument reliably; Skill: news-briefing; not used: Chinese hot lists name no universe instrument reliably; measured hollow: answered with a hollow payload (every value empty, zero or an error)hollow
defi_analytics.tvl_ranknot used: no DeFi instrument traded; Skill: market-intel; not used: no DeFi instrument traded; measured hollow: answered with a hollow payload (every value empty, zero or an error)hollow
dex_market.trendingnot used: no DEX instrument traded; Skill: market-intel; not used: no DEX instrument traded; measured hollow: answered with a hollow payload (every value empty, zero or an error)hollow
network_status.btc_feesnot used: not a pre-registered input of policy v1; Skill: market-intel; not used: not a pre-registered input of policy v1; measured hollow: answered with a hollow payload (every value empty, zero or an error)hollow
global_data.forexnot used: not a pre-registered input of policy v1; Skill: macro-analyst; not used: not a pre-registered input of policy v1; measured hollow: answered with a hollow payload (every value empty, zero or an error)hollow
cn_market.indexnot used: no China-listed instrument; Skill: macro-analyst; not used: no China-listed instrument; measured timeout: bitget-signal: reply from https://datahub.noxiaohao.com/mcp did not finish within 45stimeout
backtest.chartnot used: a live paper run does not backtest; Skill: technical-analysis; not used: a live paper run does not backtest; measured error: the server refused the call: {"error": "metrics_json is required for chart action"}error
sentiment_index.historynot used: the current value is read each snapshot and logged, which is its history; Skill: sentiment-analyst; not used: the current value is read each snapshot and logged, which is its history; measured hollow: upstream error envelope {"error": ""}hollow
derivatives_sentiment.top_positionnot used: bitget-mcp-server's top-position entry is read instead; Skill: sentiment-analyst (also market-intel, news-briefing); not used: bitget-mcp-server's top-position entry is read instead; measured hollow: upstream error envelope {"error": ""}hollow
bitget-mcp-server: 11 used, 57 not used
entryused for / judged linehealthvisible atnotes
do_query:crypto_sentiment_crypto_fear_greed
crypto Fear & Greed (primary)
decision explainability: an event trigger fires on it and says why
error
2026-09-27 17:10 UTC
decision card: mood and source agreement1 call(s): error 1; not ok: -=error; e.g. service reported failure (status 503): None; in the log: newest snapshot, 1 call(s): error 1; not ok: -=error; e.g. service reported failure (status 503): None
do_query:sentiment_market_fear_greed
equity-market Fear & Greed
decision explainability: an event trigger fires on it and says why
error
2026-09-27 17:10 UTC
decision card: mood and source agreement1 call(s): error 1; not ok: -=error; e.g. service reported failure (status 503): None; in the log: newest snapshot, 1 call(s): error 1; not ok: -=error; e.g. service reported failure (status 503): None
do_query:crypto_futures_long_short_ratio
retail long/short account ratio (Binance futures crowd)
decision explainability: the value is shown to the model and on the decision card
error
2026-09-27 17:10 UTC
decision card: positioning table14 call(s): error 14; not ok: BTCUSDT=error, SP500USDT=error, NDX100USDT=error, MSTRUSDT=error, HOODUSDT=error, CRCLUSDT=error, SNDKUSDT=error, COINUSDT=error, TSLAUSDT=error, GOOGLUSDT=error, METAUSDT=error, NVDAUSDT=error, AMZNUSDT=error, AAPLUSDT=error; e.…
do_query:crypto_futures_long_short_top_account_ratio
top-trader long/short account ratio
decision explainability: the value is shown to the model and on the decision card
error
2026-09-27 17:10 UTC
decision card: positioning table14 call(s): error 14; not ok: BTCUSDT=error, SP500USDT=error, NDX100USDT=error, MSTRUSDT=error, HOODUSDT=error, CRCLUSDT=error, SNDKUSDT=error, COINUSDT=error, TSLAUSDT=error, GOOGLUSDT=error, METAUSDT=error, NVDAUSDT=error, AMZNUSDT=error, AAPLUSDT=error; e.…
do_query:crypto_futures_long_short_top_position_ratio
top-trader long/short position ratio
decision explainability: the value is shown to the model and on the decision card
error
2026-09-27 17:10 UTC
decision card: positioning table14 call(s): error 14; not ok: BTCUSDT=error, SP500USDT=error, NDX100USDT=error, MSTRUSDT=error, HOODUSDT=error, CRCLUSDT=error, SNDKUSDT=error, COINUSDT=error, TSLAUSDT=error, GOOGLUSDT=error, METAUSDT=error, NVDAUSDT=error, AMZNUSDT=error, AAPLUSDT=error; e.…
do_query:crypto_futures_taker_volume
taker buy/sell volume ratio
decision explainability: the value is shown to the model and on the decision card
error
2026-09-27 17:10 UTC
decision card: positioning table14 call(s): error 14; not ok: BTCUSDT=error, SP500USDT=error, NDX100USDT=error, MSTRUSDT=error, HOODUSDT=error, CRCLUSDT=error, SNDKUSDT=error, COINUSDT=error, TSLAUSDT=error, GOOGLUSDT=error, METAUSDT=error, NVDAUSDT=error, AMZNUSDT=error, AAPLUSDT=error; e.…
do_query:crypto_futures_open_interest_history
hourly open-interest history: 1h and 24h change, the jump trigger
decision explainability: an event trigger fires on it and says why
error
2026-09-27 17:10 UTC
decision card: positioning table14 call(s): error 14; not ok: BTCUSDT=error, SP500USDT=error, NDX100USDT=error, MSTRUSDT=error, HOODUSDT=error, CRCLUSDT=error, SNDKUSDT=error, COINUSDT=error, TSLAUSDT=error, GOOGLUSDT=error, METAUSDT=error, NVDAUSDT=error, AMZNUSDT=error, AAPLUSDT=error; e.…
do_query:crypto_futures_funding_rate
Binance funding rate (reported in percent, converted to a fraction)
decision explainability: the value is shown to the model and on the decision card
error
2026-09-27 17:10 UTC
decision card: positioning table14 call(s): error 14; not ok: BTCUSDT=error, SP500USDT=error, NDX100USDT=error, MSTRUSDT=error, HOODUSDT=error, CRCLUSDT=error, SNDKUSDT=error, COINUSDT=error, TSLAUSDT=error, GOOGLUSDT=error, METAUSDT=error, NVDAUSDT=error, AMZNUSDT=error, AAPLUSDT=error; e.…
do_query:equity_calendar
earnings dates of the eleven underlying stocks (vendor date offset corrected)
decision explainability: an event trigger fires on it and says why
error
2026-09-26 17:12 UTC
decision card: calendar11 call(s): error 11; not ok: MSTR=error, HOOD=error, CRCL=error, SNDK=error, COIN=error, TSLA=error, GOOGL=error, META=error, NVDA=error, AMZN=error, AAPL=error; e.g. service reported failure (status 503): None
do_query:equity_ownership_insider_trading
insider (Form 4) filings of the eleven underlying stocks
decision explainability: an event trigger fires on it and says why
error
2026-09-26 17:12 UTC
decision card: calendar11 call(s): error 11; not ok: MSTR=error, HOOD=error, CRCL=error, SNDK=error, COIN=error, TSLA=error, GOOGL=error, META=error, NVDA=error, AMZN=error, AAPL=error; e.g. service reported failure (status 503): None
guide
the catalog of every bitget-mcp-server entry, read by the toolkit probe so every entry the agent does not read is measured and listed with its reason
Agent architecture quality: the Track 2 perception layer the handbook names (bitget-signal + bitget-mcp-server, handbook:396)
ok
2026-09-26 17:12 UTC
demo page: toolkit coverage matrix67 entries: crypto 39, equity 22, etf 3, news 1, sentiment 2

Not used (57), each with its reason

entryreasonmeasured
do_query:crypto_marketnot used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): Noneerror
do_query:crypto_coin_infonot used: reference data, not sentiment; measured error: service reported failure (status 503): Noneerror
do_query:crypto_spot_klinenot used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): Noneerror
do_query:crypto_spot_tickernot used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): Noneerror
do_query:crypto_spot_order_booknot used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): Noneerror
do_query:crypto_spot_tradesnot used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): Noneerror
do_query:crypto_spot_taker_volumenot used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): Noneerror
do_query:crypto_spot_big_tradesnot used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): Noneerror
do_query:crypto_futures_mark_pricenot used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): Noneerror
do_query:crypto_futures_klinenot used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): Noneerror
do_query:crypto_futures_tickernot used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): Noneerror
do_query:crypto_futures_order_booknot used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): Noneerror
do_query:crypto_futures_tradesnot used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): Noneerror
do_query:crypto_futures_open_interestnot used: the hourly history entry carries the same value; measured error: service reported failure (status 503): Noneerror
do_query:crypto_futures_liquidationsnot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_futures_big_tradesnot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_onchain_fund_flownot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_onchain_trading_signalnot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_onchain_exchange_flowsnot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_onchain_stablecoin_flownot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_onchain_token_unlock_eventnot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_institutional_company_flownot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_etf_flowsnot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_institutional_mining_company_flownot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_institutional_country_flownot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_indicators_technical_indicatorsnot used: not a pre-registered input of policy v1; measured error: service reported failure (status None): Missing required param: 'symbols'error
do_query:crypto_hyperliquid_position_distribution_by_balance_tagnot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_hyperliquid_position_distribution_by_pnl_tagnot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_hyperliquid_position_distribution_by_position_tagnot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_indicators_hyperliquid_whale_sentimentnot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_hyperliquid_whale_alertnot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:crypto_spot_big_trades_windownot used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): Noneerror
do_query:crypto_futures_big_trades_windownot used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): Noneerror
do_query:equity_price_quotenot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_price_historicalnot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_profilenot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_fundamental_managementnot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_fundamental_balancenot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_fundamental_incomenot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_fundamental_cashnot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_fundamental_metricsnot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_fundamental_ratiosnot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_fundamental_dividendsnot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_ownership_major_holdersnot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_ownership_form_13fnot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_ownership_inst_position_detailnot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_ownership_inst_position_summarynot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_estimates_price_targetnot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_estimates_forward_penot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_estimates_forward_epsnot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_estimates_forward_ebitdanot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_estimates_forward_salesnot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:equity_estimates_consensusnot used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): Noneerror
do_query:etf_infonot used: no ETF is traded; measured error: service reported failure (status 503): Noneerror
do_query:etf_holdingsnot used: no ETF is traded; measured error: service reported failure (status 503): Noneerror
do_query:etf_price_performancenot used: no ETF is traded; measured error: service reported failure (status 503): Noneerror
do_query:news_label_searchnot used: needs an integer label the catalog does not define; measured error: service reported failure (status None): Missing required param: 'label'error
GetAgent Playbook: 0 used, 1 not used
entryused for / judged linehealthvisible atnotes
none

Not used (1), each with its reason

entryreasonmeasured
Playbook replica (runtime_profile llm_bounded, official_evidence_kind paper)not used: conditional (DESIGN.md M17): it needs llm_bounded enabled on the owner's GetAgent account and a Playbook key; until then no Playbook runs and none is claimednot measured
X (not Bitget): 1 used, 0 not used
entryused for / judged linehealthvisible atnotes
twitter-cli search <cashtag> --type Latest --exclude retweets
posts naming each universe instrument, screened by quarantine and clustered for coordination before the model sees them; an optional layer (positioning is the backbone, win plan §3.2)
decision explainability: shown to the model and on the decision card
not measureddecision card: text shown to the modelnot Bitget: listed because it feeds the same decision
Reddit (not Bitget): 1 used, 0 not used
entryused for / judged linehealthvisible atnotes
rdt-cli search <alias> --sort new --json
Reddit posts naming each universe instrument, screened and clustered like X; one account is one source however many subreddits it posts in
decision explainability: shown to the model and on the decision card
not measureddecision card: text shown to the modelnot Bitget: listed because it feeds the same decision
upstream_direct: 1 used, 0 not used
entryused for / judged linehealthvisible atnotes
Binance futures/data/* and fapi/v1/fundingRate; alternative.me fng; publishers' RSS
the sources bitget-mcp-server and bitget-signal wrap, read directly only for a reading both services left empty (run2-d3), so a Bitget outage does not blind the positioning and Fear & Greed triggers
Agent architecture quality: the Track 2 perception layer the handbook names (bitget-signal + bitget-mcp-server, handbook:396)
not measureddecision card: positioning tablenot Bitget: the upstream a Bitget service names, counted apart from it

Feed health

Every source the agent reads that is failing now (an error, a timeout or a hollow answer), since when, and every trigger kind a snapshot could not evaluate, with the cause. A failing source degrades a snapshot and never stops the agent; here it is visible instead of silent.

this ledger has no feed_health events (it predates contract 1.1.0); the health of each source is in its snapshots' source calls

Proof

The key is proven to be a Demo key before the first order; the policy, prompts and code are hashed into a genesis that is timestamped and posted before trading; every event is hash-chained.

Environment proof (Demo only)

Checked
2026-09-27 17:13 UTC
Key file declares Demo
yes .secrets/demo.env
Installed SDK sends paptrading: 1
yes @bitget-ai/bitget-agent-cli@3.0.0
Demo environment accepts the key
yes code 00000
Live environment refuses the key
yes code 40099
Demo account read
yes
Hold mode
hedge_mode
Verdict
PASSED

Pre-registration

Genesis hash
ebbf607a8fe199bccc0f612ededf2a6902e4884a38d21fbfea498dff7da453a5
Created
2026-09-24 17:06 UTC
Mode
paper
Policy hash
55ff779b5d6f2c55082be1b4db6c9fde53865213cade58232f64f372ad73aeaf
Code commit
3059fcf473927093af35d9af4c999c6d135b331a
Agent Hub CLI
@bitget-ai/bitget-agent-cli@3.0.0
Model
qwen3.8-max
OpenTimestamps
submitted 2026-09-24 17:06 UTC .ots proof pending in 4 calendar(s): https://alice.btc.calendar.opentimestamps.org, https://bob.btc.calendar.opentimestamps.org, https://finney.calendar.eternitywall.com,…
upgraded 2026-09-24 17:06 UTC .ots proof complete as of 2026-09-24T23:12:59.845045Z: the proof carries a Bitcoin attestation at block 968433, 968437, 968448, 968453. It is not verified against Bitcoin…

Drafted for X, to be posted before the first order (not yet recorded as posted)

t2-sentiment-agent: a Market Sentiment Agent paper-trading on Bitget Demo. Qwen decides, a reduce-only risk kernel gates, Agent Hub executes. Genesis hash: ebbf607a8fe199bccc0f612ededf2a6902e4884a38d21fbfea498dff7da453a5 #BitgetHackathon @Bitget_AI https://x.com/Bitget_AI/status/2100519318824055159
Pre-registered statement and expected envelope

Pre-registration of the t2-sentiment-agent paper run on Bitget UTA Demo, written before its first paper order. It fixes the policy (every guard, limit and threshold, each with its measured basis), the prompt files, the universe, the metric definitions, the expected no-edge envelope, the code commit, the dependency locks, the Agent Hub CLI package and the Qwen model. Any change after this event is a logged, owner-confirmed amendment in this ledger, and thresholds are not tuned inside the window. Results are reported against the envelope with n and a block-bootstrap interval, labelled descriptive, not inferential.

{
 "closed_trades": "median 11",
 "max_drawdown_pct": "median -0.42, p95 -1.10, worst -2.48",
 "return_on_equity_bps": "median -8.6, p05 -88.1, p95 +80.6",
 "sharpe_ann": "median -2.3, p05 -20.2, p95 +16.8",
 "source": "validation/demo_venue/envelope_clean.json (no-edge coin-flip book, 17,400 windows of 72h, 25% gross)",
 "win_rate": "median 0.45, p05 0.18, p95 0.71"
}

Amendments

No amendment: the pre-registered policy has not changed.

The ledger

Events
1331 (anchor 8, budget_state 13, decision 13, environment_proof 4, fill 2, genesis 1, health 71, kernel_ruling 14, mark 71, note 12, order_ack 2, order_plan 14, order_preview 2, order_state 6, order_submitted 2, protective_action 1, reconciliation 269, snapshot 808, stop_sync 2, toolkit_probe 3, trigger 13)
Head hash
388255d7522689e64798e67ab839058a16e062a729a381a4ae14ea50cc406751
First / last
2026-09-24 17:06 UTC / 2026-09-27 17:13 UTC
File
ledger.jsonl with its head anchor ledger.jsonl.head

Replay: a recorded venue-integrity refusal

The venue-integrity guard exists because UTA Demo prints flash marks. This is the guard run on one it printed.

Keyless public GETs of Bitget's v3 history-candles for BTCPERP (USDC-FUTURES), 1H, around the hour of the Demo mark excursion recorded in validation/demo_venue/demo_integrity.json (BTCPERP worst: '09-23 13', 5.4%). Demo series were sent with the paptrading: 1 header, the live series without it. No credential, no account endpoint, no order.

Instrument
BTCPERP (USDC-FUTURES)
Hour
2026-09-23 13:00 UTC
Demo mark (hourly extreme)
90402.6
Demo index (close)
85788.1313578519705648
Mark vs index
5.38% (limit 3%); 5.28% even against the index's own high
Demo last (range in the hour)
86592 (82009 to 93939)
Live last
85743.1

What G1 (venue integrity) rules on the recorded print

A proposal to open 5% long

guardstatusceilingreason
G1 venue integrityfiredexit
exit: Demo mark 90402.6 is 5.38% from its index 85788.1313578519705648, beyond the 3.00% limit
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": "85788.1313578519705648",
 "demo_index_move_bps_3h": 19.759393729978182,
 "demo_mark": "90402.6",
 "mark_index_gap": 0.05378912641073256,
 "mark_index_limit": 0.03,
 "session_open": true,
 "stale_index_min_move_bps_3h": 2.0
}

A 5% long already held

guardstatusceilingreason
G1 venue integrityfiredexit
exit: Demo mark 90402.6 is 5.38% from its index 85788.1313578519705648, beyond the 3.00% limit
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": "85788.1313578519705648",
 "demo_index_move_bps_3h": 19.759393729978182,
 "demo_mark": "90402.6",
 "mark_index_gap": 0.05378912641073256,
 "mark_index_limit": 0.03,
 "session_open": true,
 "stale_index_min_move_bps_3h": 2.0
}

BTCPERP is a USDC-margined perpetual outside the policy universe, so G11 would refuse it too and its Demo-live p99 is not measured (G1 notes it as missing). The replay runs G1 alone on the recorded print: the mark-index check fires on its own. Even against the index's own high for the hour the gap is beyond the 3% limit.

The recorded requests (src/sentiment_agent/site/templates/replay_g1_btcperp_20260923.json)
seriesrequestfetched
demo_markGET /api/v3/market/history-candles?category=USDC-FUTURES&endTime=1790179200000&interval=1H&limit=10&symbol=BTCPERP&type=mark [paptrading: 1]2026-09-24 11:59 UTC
demo_indexGET /api/v3/market/history-candles?category=USDC-FUTURES&endTime=1790179200000&interval=1H&limit=10&symbol=BTCPERP&type=index [paptrading: 1]2026-09-24 11:59 UTC
demo_marketGET /api/v3/market/history-candles?category=USDC-FUTURES&endTime=1790179200000&interval=1H&limit=10&symbol=BTCPERP&type=market [paptrading: 1]2026-09-24 11:59 UTC
live_marketGET /api/v3/market/history-candles?category=USDC-FUTURES&endTime=1790179200000&interval=1H&limit=10&symbol=BTCPERP&type=market2026-09-24 11:59 UTC

Verify

Nothing here needs to be taken on trust.

  1. Recompute every number with the standard library alone: python scripts/recompute.py public/. It re-walks the hash chain, re-hashes every blob, rebuilds every closed trade from the fills and recomputes every metric and interval.
  2. Check the orders exist on Bitget Demo (read-only): python scripts/verify_orders.py --public public/orders.json.
  3. Replay any decision without a key: t2sa replay --public public/ --decision <decision_id>.
  4. Every card lists the ledger rows and the blobs that prove it; sha256(blobs/<hash>) equals the file name.
filewhat it is
ledger.jsonlthe hash-chained ledger, byte for byte
verify.mdhow to check everything below
metrics.jsonthe book's metric set
equity_hourly.csvone row per hourly mark
trades.csvclosed trades, flat to flat
orders.jsonevery order: clientOid, venue orderId, fills
decisions.jsonevery decision and abstention
funnel.jsonthe guard funnel
arms.jsonevery arm's marks, trades and metrics
twin.jsonthe twin report
mirror.jsonthe live-marked mirror
redteam.jsonthe red-team report
toolkit.jsonthe coverage matrix
genesis.jsonthe pre-registration
environment.jsonthe environment proofs
replay.jsonthe venue-integrity replay
cards/index.jsonevery decision card