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.
90% block-bootstrap intervals (descriptive, not inferential)
| metric | interval |
|---|---|
| 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.
- 2026-09-25 00:01 UTCEventheartbeat funding BTCUSDTDecisionflat 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 → executionapproved as askedno order
- 2026-09-25 08:01 UTCEventheartbeat funding BTCUSDTDecisionflat 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 → executionnothing to rule onno order
- 2026-09-25 13:32 UTCEventheartbeat us open SP500USDT,NDX100USDT,MSTRUSDT,HOODUSDT,CRCLUSDT,SNDKUSDT,COINUSDT,TSLAUSDT,GOOGLUSDT,METAUSDT,NVDAUSDT,AMZNUSDT,AAPLUSDTDecisionflat 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 → executionnothing to rule onno order
- 2026-09-25 16:04 UTCEventheartbeat funding BTCUSDTDecisionflat 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 → executionnothing to rule onno order
- 2026-09-26 00:02 UTCEventheartbeat funding BTCUSDTDecisionflat 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 → executionnothing to rule onno order
- 2026-09-26 08:01 UTCEventheartbeat funding BTCUSDTDecisionflat 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 → executionnothing to rule onno order
- 2026-09-26 16:01 UTCEventheartbeat funding BTCUSDTDecisionflat 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 → executionnothing to rule onno order
- 2026-09-26 17:27 UTCEventfunding zscore BTCUSDTDecisionflat 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 → executionnothing to rule onno order
- 2026-09-27 00:01 UTCEventheartbeat funding BTCUSDTDecisionflat 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 → executionnothing to rule onno order
- 2026-09-27 08:02 UTCEventheartbeat funding BTCUSDTDecisionflat 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 → executionnothing to rule onno order
- 2026-09-27 10:43 UTCEventfunding zscore BTCUSDTDecisionact 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 → executionapproved as askedBUY 0.0294 BTCUSDT filled · 1488055070669295616Open the card · realised net -1.50 USDT
- 2026-09-27 14:47 UTCEventfunding zscore BTCUSDTDecisionhold 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 → executionBTCUSDT +4.98% → +4.97% G6_turnoverfired: G6_turnoverno order
- 2026-09-27 15:06 UTCEventprotective venue integrityDecisionNo model decision: the kernel acted on its own clock.Kernel → executionBTCUSDT +4.96% → 0 (flat) G1_venue_integrityfired: G1_venue_integritySELL 0.0294 BTCUSDT filled · 1488120811372302336Open the card · realised net -13.26 USDT
- 2026-09-27 16:02 UTCEventheartbeat funding BTCUSDTDecisionflat 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 → executionnothing to rule onno 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.
- 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%
| arm | kind | return | Sharpe | max DD | win rate | trades |
|---|---|---|---|---|---|---|
| The agent, governed LLM | ours governed | -0.030% | -8.33 | -0.037% | 0.0% | 1 |
| The agent, ungoverned LLM | twin ungoverned | -0.028% | -9.41 | -0.035% | — | 0 |
| The agent, governed (replica) LLM | ours governed | -0.028% | -9.41 | -0.035% | — | 0 |
| Flat | baseline | +0.000% | — | 0.000% | — | 0 |
| BTC at our gross | baseline | -0.000% | -0.35 | -0.005% | — | 0 |
| Crowd fade, fixed rule | baseline | -0.083% | -2.03 | -0.347% | 24.3% | 37 |
| baseline coin flip: median of 1000 seeds | baseline | -0.080% | -5.22 | -0.205% | 33.3% | 9.0 |
| The same fills on live prices LLM | mirror live | -0.030% | -10.05 | -0.032% | 0.0% | 1 |
| The legs the weekend freeze took away, on live LLM | weekend 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 confluence | rival | +0.000% | — | 0.000% | — | 0 |
| Season-2 entry B: sentiment and news signal fusion | rival | +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
Exposure asked +5.01%, approved +5.00% (sum of absolute weight increases).
What reached the venue from model decisions
Every guard, every ruling
| guard | binding | fired | not evaluated | passed | n/a |
|---|---|---|---|---|---|
| G1 venue integrity | 0 | 0 | 0 | 16 | 0 |
| G2 weekend freeze | 0 | 0 | 0 | 13 | 3 |
| G3 size | 0 | 0 | 0 | 29 | 0 |
| G4 stop | 0 | 0 | 0 | 2 | 14 |
| G5 daily kill | 0 | 0 | 0 | 29 | 0 |
| G6 turnover | 1 | 1 | 0 | 15 | 0 |
| G7 fee budget | 0 | 0 | 0 | 29 | 0 |
| G8 taker only | 0 | 0 | 0 | 16 | 0 |
| G9 grounding | 0 | 0 | 0 | 2 | 14 |
| G10 breaker | 0 | 0 | 0 | 29 | 0 |
| G11 eligibility | 0 | 0 | 0 | 16 | 0 |
"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)
| reason | rulings |
|---|---|
| venue integrity | 1 |
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.
| decision | symbol | guard | asked | approved | P&L ungoverned | P&L governed |
|---|---|---|---|---|---|---|
| dec-75c5f6aceb5dc679e04e719be49d42ba | BTCUSDT | G6_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.
- 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)
| arm | return | max DD | hours |
|---|---|---|---|
| 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.
| surface | used | used and OK now | not used, with reason |
|---|---|---|---|
| Agent Hub (bgc, pinned CLI) | 14 | 11 | 14 |
| Bitget public v3 market API | 7 | 5 | 2 |
| bitget-signal (MCP) | 7 | 0 | 18 |
| bitget-mcp-server | 11 | 1 | 57 |
| GetAgent Playbook | 0 | 0 | 1 |
| X (not Bitget) | 1 | 0 | 0 |
| Reddit (not Bitget) | 1 | 0 | 0 |
| upstream_direct | 1 | 0 | 0 |
Agent Hub (bgc, pinned CLI): 14 used, 14 not used
| entry | used for / judged line | health | visible at | notes |
|---|---|---|---|---|
| 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 guard | in 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 measured | decision 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 measured | decision 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 proof | in 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 measured | demo 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 proof | in 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 proof | in 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 proof | in the log: installed SDK sends paptrading: 1 = True |
Not used (14), each with its reason
| entry | reason | measured |
|---|---|---|
| market | not 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 needs | not measured |
| account_config | not used: the agent reads the hold mode (account_overview) and never changes account settings; sizing is by notional against equity, not by leverage | not measured |
| transfer_funds | not used: a paper book moves no funds | not measured |
| deposit | not used: a paper book moves no funds | not measured |
| withdraw | not used: a paper book moves no funds, and the Demo key is created without the Withdraw permission (DESIGN.md §21) | not measured |
| repayment | not used: no margin loan is taken | not measured |
| subaccount | not used: one Demo account, no sub-accounts | not measured |
| broker | not used: not a broker integration | not measured |
| loan | not used: no loan is taken | not measured |
| inst_loan | not used: no loan is taken | not measured |
| tax | not used: outside the trading loop | not measured |
| discover | not 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 time | not 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 loop | not 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
| entry | used for / judged line | health | visible at | notes |
|---|---|---|---|---|
| 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 guard | in 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 table | in 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 measured | decision 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 mirror | in 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 guard | in 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 measured | demo 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 table | in the log: newest snapshot, 28 call(s): ok 28 |
Not used (2), each with its reason
| entry | reason | measured |
|---|---|---|
| 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
| entry | used for / judged line | health | visible at | notes |
|---|---|---|---|---|
| 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 agreement | Skill: 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 matrix | Skill: 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 matrix | Skill: 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 matrix | Skill: 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 matrix | Skill: 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 model | Skill: 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 model | Skill: 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
| entry | reason | measured |
|---|---|---|
| technical_analysis.rsi | not 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.global | not 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.price | not 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_24h | not 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.price | not 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_release | not 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_curve | not 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.correlation | not 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.earnings | not 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.trending | not 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_rank | not 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.trending | not 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_fees | not 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.forex | not 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.index | not 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 45s | timeout |
| backtest.chart | not 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.history | not 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_position | not 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
| entry | used for / judged line | health | visible at | notes |
|---|---|---|---|---|
| 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 agreement | 1 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 agreement | 1 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 table | 14 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 table | 14 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 table | 14 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 table | 14 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 table | 14 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 table | 14 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: calendar | 11 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: calendar | 11 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 matrix | 67 entries: crypto 39, equity 22, etf 3, news 1, sentiment 2 |
Not used (57), each with its reason
| entry | reason | measured |
|---|---|---|
| do_query:crypto_market | not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): None | error |
| do_query:crypto_coin_info | not used: reference data, not sentiment; measured error: service reported failure (status 503): None | error |
| do_query:crypto_spot_kline | not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): None | error |
| do_query:crypto_spot_ticker | not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): None | error |
| do_query:crypto_spot_order_book | not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): None | error |
| do_query:crypto_spot_trades | not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): None | error |
| do_query:crypto_spot_taker_volume | not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): None | error |
| do_query:crypto_spot_big_trades | not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): None | error |
| do_query:crypto_futures_mark_price | not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): None | error |
| do_query:crypto_futures_kline | not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): None | error |
| do_query:crypto_futures_ticker | not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): None | error |
| do_query:crypto_futures_order_book | not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): None | error |
| do_query:crypto_futures_trades | not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): None | error |
| do_query:crypto_futures_open_interest | not used: the hourly history entry carries the same value; measured error: service reported failure (status 503): None | error |
| do_query:crypto_futures_liquidations | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_futures_big_trades | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_onchain_fund_flow | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_onchain_trading_signal | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_onchain_exchange_flows | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_onchain_stablecoin_flow | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_onchain_token_unlock_event | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_institutional_company_flow | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_etf_flows | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_institutional_mining_company_flow | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_institutional_country_flow | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_indicators_technical_indicators | not 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_tag | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_hyperliquid_position_distribution_by_pnl_tag | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_hyperliquid_position_distribution_by_position_tag | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_indicators_hyperliquid_whale_sentiment | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_hyperliquid_whale_alert | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:crypto_spot_big_trades_window | not used: prices come from Bitget's own public v3 API, the venue orders go to; measured error: service reported failure (status 503): None | error |
| do_query:crypto_futures_big_trades_window | not used: not a pre-registered input of policy v1; measured error: service reported failure (status 503): None | error |
| do_query:equity_price_quote | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_price_historical | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_profile | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_fundamental_management | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_fundamental_balance | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_fundamental_income | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_fundamental_cash | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_fundamental_metrics | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_fundamental_ratios | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_fundamental_dividends | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_ownership_major_holders | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_ownership_form_13f | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_ownership_inst_position_detail | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_ownership_inst_position_summary | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_estimates_price_target | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_estimates_forward_pe | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_estimates_forward_eps | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_estimates_forward_ebitda | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_estimates_forward_sales | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:equity_estimates_consensus | not used: fundamentals, estimates and holdings; the agent's horizon is hours; measured error: service reported failure (status 503): None | error |
| do_query:etf_info | not used: no ETF is traded; measured error: service reported failure (status 503): None | error |
| do_query:etf_holdings | not used: no ETF is traded; measured error: service reported failure (status 503): None | error |
| do_query:etf_price_performance | not used: no ETF is traded; measured error: service reported failure (status 503): None | error |
| do_query:news_label_search | not 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
| entry | used for / judged line | health | visible at | notes |
|---|---|---|---|---|
| none | ||||
Not used (1), each with its reason
| entry | reason | measured |
|---|---|---|
| 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 claimed | not measured |
X (not Bitget): 1 used, 0 not used
| entry | used for / judged line | health | visible at | notes |
|---|---|---|---|---|
| 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 measured | decision card: text shown to the model | not Bitget: listed because it feeds the same decision |
Reddit (not Bitget): 1 used, 0 not used
| entry | used for / judged line | health | visible at | notes |
|---|---|---|---|---|
| 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 measured | decision card: text shown to the model | not Bitget: listed because it feeds the same decision |
upstream_direct: 1 used, 0 not used
| entry | used for / judged line | health | visible at | notes |
|---|---|---|---|---|
| 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 measured | decision card: positioning table | not 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
| guard | status | ceiling | reason |
|---|---|---|---|
| G1 venue integrity | fired | exit | exit: Demo mark 90402.6 is 5.38% from its index 85788.1313578519705648, beyond the 3.00% limit basis and inputsDemo 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
| guard | status | ceiling | reason |
|---|---|---|---|
| G1 venue integrity | fired | exit | exit: Demo mark 90402.6 is 5.38% from its index 85788.1313578519705648, beyond the 3.00% limit basis and inputsDemo 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)
| series | request | fetched |
|---|---|---|
| demo_mark | GET /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_index | GET /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_market | GET /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_market | GET /api/v3/market/history-candles?category=USDC-FUTURES&endTime=1790179200000&interval=1H&limit=10&symbol=BTCPERP&type=market | 2026-09-24 11:59 UTC |
Verify
Nothing here needs to be taken on trust.
- 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. - Check the orders exist on Bitget Demo (read-only):
python scripts/verify_orders.py --public public/orders.json. - Replay any decision without a key:
t2sa replay --public public/ --decision <decision_id>. - Every card lists the ledger rows and the blobs that prove it;
sha256(blobs/<hash>)equals the file name.
| file | what it is |
|---|---|
| ledger.jsonl | the hash-chained ledger, byte for byte |
| verify.md | how to check everything below |
| metrics.json | the book's metric set |
| equity_hourly.csv | one row per hourly mark |
| trades.csv | closed trades, flat to flat |
| orders.json | every order: clientOid, venue orderId, fills |
| decisions.json | every decision and abstention |
| funnel.json | the guard funnel |
| arms.json | every arm's marks, trades and metrics |
| twin.json | the twin report |
| mirror.json | the live-marked mirror |
| redteam.json | the red-team report |
| toolkit.json | the coverage matrix |
| genesis.json | the pre-registration |
| environment.json | the environment proofs |
| replay.json | the venue-integrity replay |
| cards/index.json | every decision card |