@battlegrid/mcp-server 31.2.64 → 31.2.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -24,6 +24,91 @@ Seeing package `31.x` alongside handshake `battlegrid@33.x` — the package **be
24
24
 
25
25
  **What this changes for you:** nothing about how you call anything. Upgrading the package no longer waits on a server deploy, and a server deploy no longer strands you on a package that names the wrong contract — reconnect and the announcement follows. **Contract breaking-change notes are no longer keyed to package versions**, since a contract move is no longer a release here; the v11-and-earlier notes below are kept as history, and the live vocabulary is always discovery.
26
26
 
27
+ ## Contract history — v85 (agents and strategies change only through their drafts)
28
+
29
+ **Breaking at v85: seven tools are retired, and a surviving tool refuses an input it accepted at v84.**
30
+ v85 is the contract on top of v84.
31
+
32
+ Every agent and strategy is now created and changed the same way: stage the change into the
33
+ entity's draft, read the draft back with its diff, diagnostics and impact, and commit exactly the
34
+ draft version and the live revision that read returned.
35
+
36
+ ### Removed tools
37
+
38
+ - **`compile_strategy_plan`, `stage_strategy_plan`, `apply_strategy_plan`, `update_strategy_signal_rule`,
39
+ `create_intelligence_agent`, `update_intelligence_agent`, `rebind_intelligence_agent`** are gone, with
40
+ no alias; a call gets an unknown-tool error. The replacements: `get_strategy_draft` →
41
+ `stage_strategy_draft` → `commit_strategy_draft` for a strategy (a signal rule is a row of the draft's
42
+ `SIGNAL_RULES` axis), and `stage_agent_draft` → `get_agent_draft` → `commit_agent_draft` for an agent
43
+ (a rebind is the draft's `STRATEGY_BINDING` axis).
44
+
45
+ ### Added tools
46
+
47
+ - **`stage_strategy_draft { strategyId?, draftVersion, axes }`**, **`commit_strategy_draft`** and
48
+ **`commit_agent_draft`** (`{ <id>, draftVersion, expectedRevision }`, `expectedRevision` null for a
49
+ create). A commit publishes exactly the draft version and the live revision the caller read, is
50
+ idempotent on `{ id, draftVersion }`, and returns the kind's committer response plus the draft's
51
+ `draftVersion` after its clear (null when the commit emptied it).
52
+
53
+ ### Rejected input
54
+
55
+ - **`archive_strategy` no longer takes `confirm`.** A request carrying it is refused with the
56
+ unknown-key error — a break on a surviving tool.
57
+ - **`discard_agent_draft` and `discard_strategy_draft` take `draftVersion`** (the version
58
+ `get_<kind>_draft` returned) in place of `confirm`; `confirm` is refused as an unknown key, and a
59
+ version the draft moved past is refused `DRAFT_VERSION_MOVED`.
60
+ - **`preview_strategy_report` takes `{ coinSelection, source }`.** The report fields move under
61
+ `source: { kind: 'FIELDS', … }`, and `source: { kind: 'DRAFT', strategyId, draftVersion }` previews the
62
+ owner's draft as a commit would compose it. A body with the fields at the top level is refused.
63
+ - **A strategy's ENTRY axis is a union discriminated by `trigger`**: `{ trigger: 'ON_CANDLE_CLOSE' }`
64
+ alone, or a level trigger with `levelOffsetAtrMultiple` and `validForBars`. `ON_CANDLE_CLOSE` naming
65
+ either dial is refused, which the retired compile accepted; the server stamps the seed values.
66
+
67
+ ### Widened input
68
+
69
+ - **`stage_agent_draft` accepts `STRATEGY_BINDING` on an edit draft**, where v84 refused it: a staged
70
+ binding commits as the agent's rebind. Its TRADING_CONFIG axis now describes each size preset as the
71
+ risk budget lost at the hard stop.
72
+
73
+ ### Reshaped output
74
+
75
+ - **`fork_strategy` returns `{ strategyId, draftVersion }`** — the create draft it wrote, holding a copy
76
+ of the source — in place of `{ strategy }`. No strategy exists until that draft commits.
77
+ - **`get_agent_draft` and `get_strategy_draft` gain `draftVersion`** (0 when no draft is held, beside a
78
+ null `draft`), **`committedRevision`, a per-axis `diff` against live, `diagnostics` and `impact`.**
79
+ - **`stage_agent_draft` gains `diagnostics`**, the composed draft's errors and warnings.
80
+ - **`discard_agent_draft` and `discard_strategy_draft` return `discarded: true` only**; a discard that
81
+ finds nothing is refused rather than answered `false`.
82
+
83
+ ### Widened enum
84
+
85
+ - **Strategy draft axes gain `ORIGIN`**, the create-only axis a fork writes, on `list_strategy_drafts`
86
+ and every strategy draft read. A client switching exhaustively on a strategy draft axis must add the
87
+ branch.
88
+ - **Error codes gain `DRAFT_VERSION_MOVED`** (details `draftVersion`, null when no draft is held) **and
89
+ `DRAFT_AXIS_CONTESTED`** (details `contestedAxes` and `draftVersion`), both 409.
90
+ - **Refusal details gain `nextAct`.** Every draft-specific refusal, the revision `CONFLICT` and the
91
+ in-flight commit refusal carry `nextAct: 'get_draft'`; a commit's validation refusal carries
92
+ `nextAct: 'stage'`; every other refusal carries none. `details.expectedRevision` widens to
93
+ `number | null`.
94
+
95
+ ### Removed error code
96
+
97
+ - **`PLAN_APPROVAL_NOT_FOUND`**, with the plan path that raised it.
98
+
99
+ ### Behaviour behind unchanged schemas
100
+
101
+ - **`archive_strategy` and `restore_strategy` no longer refuse around the owner's unsaved draft**: they
102
+ re-base it onto the revision they write. `restore_strategy`'s description drops the compile route — a
103
+ repair is staged into the draft and committed, which restores the strategy.
104
+ - **The `author-strategy` prompt** reads "Discover, stage, review, and commit a BattleGrid strategy
105
+ through its draft".
106
+ - **The server's manifest records a description hash per tool** (manifest format 4), and the tool count
107
+ moves 142 → 138.
108
+
109
+ A strict client that rejects unknown keys fails to parse `fork_strategy` and the draft reads at v85;
110
+ list the tools again after the server deploys.
111
+
27
112
  ## Contract history — v84 (the hold moves from the condition to each clause and group)
28
113
 
29
114
  **Breaking at v84: a condition body accepted at v83 is refused, and condition evidence is reshaped.**
@@ -2250,7 +2335,7 @@ For the strict authoring tools, the multi-account input is exactly `{ account, r
2250
2335
 
2251
2336
  ```json
2252
2337
  {
2253
- "name": "compile_strategy_plan",
2338
+ "name": "commit_strategy_draft",
2254
2339
  "inputSchema": {
2255
2340
  "type": "object",
2256
2341
  "properties": {
@@ -2260,11 +2345,14 @@ For the strict authoring tools, the multi-account input is exactly `{ account, r
2260
2345
  "description": "Which BattleGrid account to use for this action"
2261
2346
  },
2262
2347
  "request": {
2263
- "oneOf": [
2264
- { "properties": { "operation": { "const": "CREATE" } } },
2265
- { "properties": { "operation": { "const": "UPDATE" } } },
2266
- { "properties": { "operation": { "const": "RESTORE" } } }
2267
- ]
2348
+ "type": "object",
2349
+ "properties": {
2350
+ "strategyId": { "type": "string", "format": "uuid" },
2351
+ "draftVersion": { "type": "integer", "minimum": 1 },
2352
+ "expectedRevision": { "anyOf": [{ "type": "integer", "minimum": 1 }, { "type": "null" }] }
2353
+ },
2354
+ "required": ["strategyId", "draftVersion", "expectedRevision"],
2355
+ "additionalProperties": false
2268
2356
  }
2269
2357
  },
2270
2358
  "required": ["account", "request"],
@@ -2287,24 +2375,19 @@ Each account supports one active key at a time. Generating a new key automatical
2287
2375
 
2288
2376
  For paid games and autonomous wagering, enable **Server-Signed Wagers** in the MCP tab (`mcp:wager` scope). Strategy discovery and non-financial configuration writes only need `mcp:read`.
2289
2377
 
2290
- ## Strategy authoring (compile → review → apply)
2378
+ ## Strategy and agent authoring (stage → read → commit)
2291
2379
 
2292
- Strategies are authored through one strict, whole-plan workflow. **Compilation changes no strategy, agent or revision; `apply_strategy_plan` is the only write to the strategy itself** — but compile is not read-only either: it parks the plan its own apply reads, and each call mints a distinct record and token, so compile once per reviewed payload and never retry or parallelise it. Always review the exact returned plan before confirming.
2380
+ Strategies and intelligence agents change only through their drafts, with one tool family per kind (`<kind>` is `strategy` or `agent`): `stage_<kind>_draft`, `get_<kind>_draft`, `commit_<kind>_draft`, `discard_<kind>_draft` and `list_<kind>_drafts`. **A stage writes the player's unsaved draft and commits nothing; `commit_<kind>_draft` is the only write to the entity itself**, and it publishes exactly the draft the caller read.
2293
2381
 
2294
- 1. **Choose the operation and revision.** `list_strategies` (add `includeInactive:true` when preparing a RESTORE) and `get_strategy` return the current `revision`; thread it into the next revisioned call.
2382
+ 1. **Choose the entity.** `list_strategies` (add `includeInactive:true` when repairing an archived strategy) and `get_strategy`, or `list_intelligence_agents` and `get_intelligence_agent`. `fork_strategy({ strategyId, sourceRevision })` copies a visible revision into a new create draft and returns its `strategyId` and `draftVersion`; it creates nothing.
2295
2383
  2. **Discover the report vocabulary live.** Walk `list_strategy_categories` → `list_strategy_vocabulary` → `get_metric_construction_hints` → `get_strategy_column_contract`, and use `get_strategy_section_template` / `preview_strategy_report`. Do not guess metric, transform, parameter, template, or enabled-timeframe facts — they are server-discovered.
2296
- 3. **Compile one complete plan.** Call `compile_strategy_plan({ request })` where the nested request is exactly one strict branch plus a bounded `coinSelection`, `intentSummary`, and `assumptions`:
2297
- - **CREATE** supplies the full new strategy.
2298
- - **UPDATE** supplies at least one changed axis and `expectedRevision`.
2299
- - **RESTORE** targets an owned inactive revision (with any repair axes).
2300
- 4. **Review before confirming.** Inspect the returned `approvedPlan` (complete post-state, proposed revision, diff, bound-agent impact, expiry) and `reviewContext` (column contracts, point-in-time report preview, open positions, quota/name admission). The plan token expires after five minutes; recompile after expiry or drift.
2301
- 5. **Apply the plan the server already holds.** After explicit user approval, call `apply_strategy_plan({ request: { planToken, confirm: true } })`. **There is no `plan` member** — one is rejected as an unknown key. The server keeps the plan its own compile approved and reads it back, so nothing is copied out of the compile response and nothing can be mistyped or truncated in transit. Forward `planToken` byte-for-byte exactly as received: it is an opaque signed value, never retyped, paraphrased or rebuilt from memory, and a mangled one addresses no approved plan and is refused. `PLAN_APPROVAL_NOT_FOUND` means no approved plan answers to this token — already applied, lapsed, or never issued — and the recovery is to compile again; so is `TOKEN_EXPIRED` once the five minutes run out. Any other refusal (quota, name collision, a bound agent that changed, a moved catalog) **leaves the plan applicable**: clear the cause and confirm again with the same token while it lives. Changed configuration propagates to every bound agent immediately.
2302
-
2303
- The authored axes — including normalized `sections` and `conditions`, each condition carrying its own required, nullable `verdict` — belong on the **compile** request. Every derived field (`diff`, `viability`, `mismatches`, `signalRules`, `creationSeed`, `proposedRevision`, `bindingImpact`, `authoringCatalogDigest`, `reviewContext`) is re-derived server-side and rejected as an unknown key if resubmitted, and `conditionVerdicts` is rejected with a message naming its replacement — the verdict belongs on the condition.
2384
+ 3. **Read the draft.** `get_<kind>_draft({ request: { <id> } })` returns the draft (or `null`), its `draftVersion` (0 when none is held), the live `committedRevision` (null for an entity not created yet), a per-axis `diff` against live, `diagnostics` and `impact`.
2385
+ 4. **Stage the change.** `stage_<kind>_draft({ request: { <id>?, draftVersion, axes } })` names the version you read. Each axis is whole, except a strategy's `SIGNAL_RULES`, whose rows replace the drafted rows for the same signals and keep every other one. Omit the id to open a new create draft; the response carries the minted id. A stage that has written never refuses: the composed draft's errors and warnings come back as `diagnostics`. It is refused only when the version is one the draft never reached (`DRAFT_VERSION_MOVED`) or when the player's own form changed an axis you are staging after that version (`DRAFT_AXIS_CONTESTED`, naming `contestedAxes`).
2386
+ 5. **Review with the player, then commit.** Read the draft again, show the player its diff and impact, and on their explicit word call `commit_<kind>_draft({ request: { <id>, draftVersion, expectedRevision } })` with exactly the two numbers that read returned — `expectedRevision: null` creates the entity at revision 1. A draft that moved is refused `DRAFT_VERSION_MOVED`, a moved revision `CONFLICT`, and an invalid draft with the same code its diagnostics carried; nothing is written. Each refusal's `details.nextAct` says what to do next (`get_draft` or `stage`). The commit is idempotent on `{ id, draftVersion }`: a retried commit replays its outcome. Changed strategy configuration propagates to every bound agent immediately; committing a draft of an archived strategy restores it.
2304
2387
 
2305
- `update_strategy_signal_rule({ request })` is the thin, focused one-rule edit. In multi-account mode every one of these calls uses the `{ account, request }` sibling envelope.
2388
+ `discard_<kind>_draft({ request: { <id>, draftVersion } })` removes the draft at the version you read and never one that moved since. `preview_strategy_report({ coinSelection, source: { kind: 'DRAFT', strategyId, draftVersion } })` previews a draft as a commit would compose it. In multi-account mode every one of these calls uses the `{ account, request }` sibling envelope.
2306
2389
 
2307
- **Strategy-bound agents.** Bind a strategy to an intelligence agent at creation time — `create_intelligence_agent({ …, strategyId })` (discover `strategyId` via `list_strategies`). Rebinding via `update_intelligence_agent` requires `confirm:true`. There is no direct `create_strategy` operation.
2390
+ **Strategy-bound agents.** An agent binds to a strategy through its draft's `STRATEGY_BINDING` axis — on a create draft, or on an edit draft as a rebind that commits through the same `commit_agent_draft` (discover `strategyId` via `list_strategies`). The plan tools, `update_strategy_signal_rule` and the direct agent writers are retired, and so is `create_strategy`.
2308
2391
 
2309
2392
  ## Capabilities
2310
2393
 
@@ -2468,7 +2551,7 @@ you reach over MCP:
2468
2551
  | `battlegrid-arena-play` | Enter Market Grid sessions: find an open session, read its coin pool and live market context, compose a grid with real per-coin reasoning or have an agent generate it, submit, then read results and the reasoning journal |
2469
2552
  | `battlegrid-market-analysis` | Read the current crypto market — regime, funding and open interest, leaders and laggards, a deep-dive on any named coin — and close with the levels worth watching |
2470
2553
  | `battlegrid-radar-deployment` | Put agents on standing duty: per-coin Radar policies that fire on confirmed regime flips, and per-preset Arena deployment policies, previewed before they are written and un-deployed with the blast radius stated |
2471
- | `battlegrid-strategy-authoring` | Build a strategy from a plain-English idea: gather evidence, lock the spec, compile against the platform grammar, review exactly what will run, apply only on confirmation. Also fork, tune, restore, archive, preview |
2554
+ | `battlegrid-strategy-authoring` | Build a strategy from a plain-English idea: gather evidence, lock the spec, stage it into the strategy's draft, review the diff, diagnostics and impact, commit only on confirmation. Also fork, tune, restore, archive, preview |
2472
2555
  | `battlegrid-strategy-doctor` | Diagnose an agent that is not doing what was expected — why it has not traded, why it stopped, whether it is healthy — from typed fields, then rank the fixes with the exact lever each needs |
2473
2556
  | `battlegrid-strategy-examples` | Full-surface composition patterns: custom report sections and header grammar, benchmark sections, condition trees with verdicts and enforcement gates, tiered signal weights and the aggregate gate math, routing gates, ATR trade levels, position management, plus validated desk-grade playbooks and TradingView process ports |
2474
2557
  | `battlegrid-trade-analysis` | Read your own trading position: where the money is, whether each agent is doing its job, what is open and how close it sits to its protections, and whether the automation is actually running |
package/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: battlegrid
3
- description: MCP skill for BattleGrid — play crypto prediction games (Market Grid), author trading strategies with the strict compile → review → apply workflow, and manage strategy-bound intelligence agents from AI agents.
3
+ description: MCP skill for BattleGrid — play crypto prediction games (Market Grid), author trading strategies and intelligence agents through their drafts (stage → read the diff → commit on the player's word), and manage strategy-bound agents from AI agents.
4
4
  ---
5
5
 
6
6
  # BattleGrid
@@ -34,44 +34,47 @@ to connect and to know which one to open.
34
34
 
35
35
  ## Single-account vs multi-account request shape
36
36
 
37
- The strategy-authoring tools — `get_strategy_section_template`, `update_strategy_signal_rule`, `compile_strategy_plan`, `apply_strategy_plan` — use one strict server-owned envelope, `{ request: canonicalPayload }`.
37
+ The draft lifecycle tools — `stage_<kind>_draft`, `get_<kind>_draft`, `commit_<kind>_draft`, `discard_<kind>_draft` and `list_<kind>_drafts` for the `strategy` and `agent` kinds — and `get_strategy_section_template` use one strict server-owned envelope, `{ request: canonicalPayload }`.
38
38
 
39
- - **Single account:** call them as the server publishes them, e.g. `compile_strategy_plan({ request })`.
39
+ - **Single account:** call them as the server publishes them, e.g. `stage_strategy_draft({ request })`.
40
40
  - **Multiple accounts (proxy):** live discovery adds a sibling `account`, so the shape is exactly `{ account, request }`. Select the account in the outer field; keep `request` exactly as discovered. The proxy strips only `account` and forwards the unchanged `{ request }`.
41
41
 
42
42
  Never put `account` inside `request`, and never flatten request fields beside it. Other tools keep whatever input shape live discovery reports for them.
43
43
 
44
44
  ## Scopes
45
45
 
46
- - `mcp:read` — strategy discovery **and** non-financial configuration writes (author strategies, edit agents, customize signals). Treat it as configuration authority, not view-only.
46
+ - `mcp:read` — strategy discovery **and** non-financial configuration writes (stage and commit strategy and agent drafts, customize signals). Treat it as configuration authority, not view-only.
47
47
  - `mcp:wager` — financial actions (submit paid entries, accept/cancel entry decisions, deployment policies). Enable **Server-Signed Wagers** in Profile → MCP to grant it. Pending entry decisions come from the conversational surface, which waits for approval; an agent deployed to a radar coin or a trading-enabled arena slot executes without one.
48
48
 
49
- ## Author a strategy, and bind it to an agent
49
+ ## Author a strategy or an agent, and bind them
50
50
 
51
- **The arc lives in `battlegrid-strategy-authoring`** — activate it, and `battlegrid-strategy-examples`
52
- alongside it when the strategy goes beyond a bare template. Do not compose a plan from this document;
53
- it states only what the *proxy* adds to that arc.
51
+ **The arc lives in `battlegrid-strategy-authoring` and `battlegrid-agent-management`** — activate the
52
+ one you need, and `battlegrid-strategy-examples` alongside the first when the strategy goes beyond a
53
+ bare template. Do not compose a draft from this document; it states only what the *proxy* adds to
54
+ that arc.
54
55
 
55
- Three facts about transport, which are this skill's to state because they are about the wire rather
56
+ Four facts about transport, which are this skill's to state because they are about the wire rather
56
57
  than about authoring:
57
58
 
58
59
  - **The envelope is `{ request }`, or `{ account, request }` on a multi-account proxy** (see above).
59
- It applies to `get_strategy_section_template`, `update_strategy_signal_rule`,
60
- `compile_strategy_plan`, `apply_strategy_plan` and `stage_strategy_plan`.
61
- - **`planToken` is opaque and is forwarded byte-for-byte.** Never retype, paraphrase, abbreviate or
62
- rebuild it from memory — the proxy passes the bytes through unchanged, and a mangled token
63
- addresses no approved plan and is refused. It lives five minutes.
64
- - **`apply_strategy_plan` carries no `plan` member.** One is rejected as an unknown key: the server
65
- reads back the plan its own compile approved, so nothing is copied out of the compile response and
66
- nothing can be truncated or half-reconstructed in transit. Send
67
- `{ request: { planToken, confirm: true } }` and nothing else. **`stage_strategy_plan` is the same
68
- shape with the token alone** — it puts the plan into the player's unsaved draft for them to review
69
- in the builder, commits nothing, and leaves the token still applicable.
70
-
71
- Agents bind to a strategy at creation (`create_intelligence_agent({ …, modelId, strategyId })`);
72
- there is no direct strategy-creation tool. **`battlegrid-agent-management`** carries commissioning,
73
- reconfiguration, rebinding and intervention; **`battlegrid-radar-deployment`** carries putting an
74
- agent on standing duty; **`battlegrid-strategy-doctor`** carries diagnosing one that is not trading.
60
+ It applies to every draft lifecycle tool and to `get_strategy_section_template`.
61
+ - **Every change goes through the entity's draft.** `stage_<kind>_draft({ request: { <id>?,
62
+ draftVersion, axes } })` writes proposed axes into the player's unsaved draft and commits nothing;
63
+ omit the id to open a new create draft, whose minted id the response carries.
64
+ `get_<kind>_draft({ request: { <id> } })` returns the draft, its `draftVersion`, the live
65
+ `committedRevision`, a per-axis `diff`, `diagnostics` and `impact`.
66
+ - **A commit names exactly the two numbers that read returned.**
67
+ `commit_<kind>_draft({ request: { <id>, draftVersion, expectedRevision } })` — `expectedRevision`
68
+ is `null` for an entity not created yet. Commit only after the player has seen the diff and impact
69
+ and said yes. `discard_<kind>_draft({ request: { <id>, draftVersion } })` is the same fence.
70
+ - **The proxy forwards numbers and `null` unchanged.** It never fills in a version, never retries a
71
+ refused call and never rebuilds a request: a `DRAFT_VERSION_MOVED`, `DRAFT_AXIS_CONTESTED` or
72
+ revision `CONFLICT` refusal carries `details.nextAct`, and the next act is the caller's.
73
+
74
+ `fork_strategy` copies a revision into a new create draft and creates nothing until that draft is
75
+ committed. An agent binds to a strategy through its draft's `STRATEGY_BINDING` axis, on a create or
76
+ as a rebind. **`battlegrid-radar-deployment`** carries putting an agent on standing duty;
77
+ **`battlegrid-strategy-doctor`** carries diagnosing one that is not trading.
75
78
 
76
79
  ## Play a game (Market Grid)
77
80
 
@@ -85,7 +88,7 @@ The `play-market-grid` prompt (discover via `prompts/list`) provides a guided en
85
88
 
86
89
  ## Retired operations
87
90
 
88
- `create_strategy` (and other legacy direct-authoring/agent-scoped rule tools) are **retired** — they are absent from discovery and cannot be invoked. Author strategies with compile → review → apply, edit rules with `update_strategy_signal_rule`, and bind strategies to agents at agent creation. Do not attempt flat legacy payloads; the server enforces a closed-world request root and the proxy never reconstructs them.
91
+ `create_strategy`, the plan tools (`compile_strategy_plan`, `stage_strategy_plan`, `apply_strategy_plan`), `update_strategy_signal_rule`, and the direct agent writers (`create_intelligence_agent`, `update_intelligence_agent`, `rebind_intelligence_agent`) are **retired** — they are absent from discovery and cannot be invoked. Stage into the entity's draft, read it back, and commit the version you read; a signal rule is a row of the strategy draft's `SIGNAL_RULES` axis, and a strategy binding is the agent draft's `STRATEGY_BINDING` axis. Do not attempt flat legacy payloads; the server enforces a closed-world request root and the proxy never reconstructs them.
89
92
 
90
93
  ## Common errors
91
94
 
@@ -95,7 +98,9 @@ The `play-market-grid` prompt (discover via `prompts/list`) provides a guided en
95
98
  | `API key must start with "bg_live_"` | Invalid key format | Generate a new key at battlegrid.trade → Profile → MCP |
96
99
  | Authentication failed (401/403) | Key revoked/rotated | Generate a new key and **restart** the proxy (keys read once at startup) |
97
100
  | `"account" parameter is required` | Multi-account call missing `account` | Add the outer `account`; keep `request` unchanged |
98
- | Plan token expired / revision drift | >5 min since compile, or upstream changed | Recompile, review the fresh plan, then apply |
101
+ | `DRAFT_VERSION_MOVED` | The draft changed after you read it, or no draft is held (`details.draftVersion` null) | Call `get_<kind>_draft` again and commit what it now holds |
102
+ | `DRAFT_AXIS_CONTESTED` | The player changed `details.contestedAxes` in their open form after the version you staged against | Read the draft again and propose against what they now have |
103
+ | `CONFLICT` on a commit | The live revision moved after the draft read | Read the draft again; commit at the new `committedRevision` |
99
104
  | Required at allocation Off | A rule flags `required` on a signal weighted `0` (contract 34) | Read `details.inertRequiredSignalIds`; per signal either raise `allocation` or set `required: false` |
100
- | Method not found | Calling a retired/unknown tool | Re-run `tools/list`; use the compile → review → apply flow |
105
+ | Method not found | Calling a retired/unknown tool | Re-run `tools/list`; stage, read and commit through the entity's draft |
101
106
  | `Wager scope required` | `mcp:wager` not enabled | Enable Server-Signed Wagers in Profile → MCP |
package/dist/index.d.ts CHANGED
@@ -49,7 +49,7 @@ import { type Implementation, type Prompt, type Resource } from '@modelcontextpr
49
49
  * being asked. Move it for a change to THIS package — a proxy fix, a dependency bump, a docs
50
50
  * correction. Never move it to track the server.
51
51
  */
52
- export declare const PACKAGE_VERSION = "31.2.64";
52
+ export declare const PACKAGE_VERSION = "31.2.65";
53
53
  export declare const DEFAULT_URL = "https://mcp.battlegrid.trade/mcp";
54
54
  export interface EnvConfig {
55
55
  apiKeys: string[];
package/dist/index.js CHANGED
@@ -52,7 +52,7 @@ import { ListToolsRequestSchema, CallToolRequestSchema, ListPromptsRequestSchema
52
52
  * being asked. Move it for a change to THIS package — a proxy fix, a dependency bump, a docs
53
53
  * correction. Never move it to track the server.
54
54
  */
55
- export const PACKAGE_VERSION = '31.2.64';
55
+ export const PACKAGE_VERSION = '31.2.65';
56
56
  export const DEFAULT_URL = 'https://mcp.battlegrid.trade/mcp';
57
57
  const MAX_RETRIES = 3;
58
58
  const RETRY_DELAYS_MS = [2000, 4000, 8000];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@battlegrid/mcp-server",
3
- "version": "31.2.64",
3
+ "version": "31.2.65",
4
4
  "description": "BattleGrid MCP server — play crypto prediction games from AI agents",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",