@coinrithm/mcp-trading 0.7.13 → 0.7.15

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.
Files changed (49) hide show
  1. package/CHANGELOG.md +692 -573
  2. package/README.md +400 -364
  3. package/dist/agent/act.d.ts +7 -2
  4. package/dist/agent/act.js +10 -3
  5. package/dist/agent/cli.d.ts +1 -0
  6. package/dist/agent/cli.js +25 -4
  7. package/dist/agent/client.d.ts +13 -0
  8. package/dist/agent/client.js +107 -4
  9. package/dist/agent/decisionReceipt.d.ts +5 -1
  10. package/dist/agent/decisionReceipt.js +95 -3
  11. package/dist/agent/decisionValidator.js +74 -0
  12. package/dist/agent/definitionSnapshot.d.ts +22 -0
  13. package/dist/agent/definitionSnapshot.js +28 -0
  14. package/dist/agent/engine.d.ts +1 -0
  15. package/dist/agent/engine.js +1 -0
  16. package/dist/agent/futuresEligibility.d.ts +36 -0
  17. package/dist/agent/futuresEligibility.js +90 -0
  18. package/dist/agent/mergeRules.d.ts +1 -1
  19. package/dist/agent/mergeRules.js +17 -2
  20. package/dist/agent/observe.d.ts +9 -1
  21. package/dist/agent/observe.js +507 -45
  22. package/dist/agent/pmContext.d.ts +10 -1
  23. package/dist/agent/pmContext.js +163 -1
  24. package/dist/agent/prompt.d.ts +14 -0
  25. package/dist/agent/prompt.js +138 -27
  26. package/dist/agent/providerCapabilities.d.ts +3 -0
  27. package/dist/agent/providerCapabilities.js +34 -4
  28. package/dist/agent/providers.d.ts +3 -0
  29. package/dist/agent/providers.js +12 -2
  30. package/dist/agent/resolve.js +8 -1
  31. package/dist/agent/runner.js +140 -18
  32. package/dist/agent/skill.js +9 -0
  33. package/dist/agent/skillValidator.js +11 -2
  34. package/dist/agent/strictLint.js +1 -0
  35. package/dist/agent/templates.js +30 -30
  36. package/dist/agent/types.d.ts +138 -1
  37. package/dist/agent/types.js +4 -0
  38. package/dist/client.d.ts +11 -2
  39. package/dist/client.js +22 -10
  40. package/dist/http.d.ts +1 -0
  41. package/dist/http.js +17 -2
  42. package/dist/httpCompletion.d.ts +1 -1
  43. package/dist/httpCompletion.js +1 -0
  44. package/dist/index.js +2 -1
  45. package/dist/instructions.d.ts +1 -0
  46. package/dist/instructions.js +16 -0
  47. package/dist/tools.d.ts +1 -0
  48. package/dist/tools.js +150 -66
  49. package/package.json +97 -97
package/CHANGELOG.md CHANGED
@@ -1,573 +1,692 @@
1
- # Changelog
2
-
3
- All notable changes to `@coinrithm/mcp-trading` are documented here. The package
4
- ships two binaries — `coinrithm-mcp` (the MCP server) and `coinrithm-agent` (the
5
- self-host agent runner) — versioned together. The CoinRithm **API contract** is
6
- versioned separately (see `openapi.yaml` `info.version`, currently `1.7.0`).
7
-
8
- ## 0.7.13
9
-
10
- - Preserve optional per-outcome venue terms in compact prediction-market output,
11
- including explicit unavailable values and valid false/zero facts.
12
- - Include candle volume coverage in agent fundamentals: positive counts identify
13
- missing expected venues; unknown coverage stays unknown. Preserve measured zero
14
- volume and keep each volume paired with its own coverage.
15
- - Classify provider capacity failures consistently, including HTTP 503
16
- resource exhaustion, in runner results and configured same-model retries.
17
- - Export `classifyProviderFailure` from the supported engine entry point.
18
- Retry counts and trading behavior are unchanged.
19
- - Surface signed cumulative futures funding and its applied-through timestamp to
20
- the agent observation so funding already reflected in balances is not counted twice.
21
- - Add public whale-wallet context to the 40-tool surface: bounded 7-day or
22
- 30-day wallet activity and source/wallet movement detail, with provenance and
23
- provider-reported context kept distinct from CoinRithm's observed trade flow.
24
- - Clarify `pm_data_calibration` as market-price calibration: the primary lane
25
- uses one complete-book snapshot in the inclusive 20–28 hour pre-resolution
26
- window, with event-weighted ECE and separate `finalPrice`/`ownCapture` lanes.
27
-
28
- Publication and hosted deployment are verified separately. See the repository's
29
- [release status](https://github.com/CoinRithm/coinrithm-agent-trading#version-clarity)
30
- for registry availability and the hosted runtime evidence.
31
-
32
- ## 0.7.12 — 2026-09-15
33
-
34
- Clarify `whoami`, `cancel_spot_order` and `report_pm_opportunity` descriptions,
35
- removing execution-cost prose unrelated to these operations. Document actual
36
- authentication, side effects, result fields and retry behavior.
37
-
38
- Spot cancellation now advertises its existing idempotent behavior. Opportunity
39
- reporting no longer advertises unconditional idempotency: duplicate protection
40
- requires `decisionId` (or `agentTrace.decisionId`) under the same API key; the
41
- first stored record wins. Reporting remains a write despite requiring only the
42
- `read` scope, and its evidence remains explicitly self-reported.
43
-
44
- Tool names, accepted inputs and execution behavior are unchanged. Published on
45
- npm and deployed to hosted MCP on 2026-09-15; registry and GitHub downloads match
46
- the CI archive. A clean registry installation passed startup and tool metadata
47
- checks. See the [release record](https://github.com/CoinRithm/coinrithm-agent-trading/releases/tag/mcp-trading-v0.7.12).
48
- Glama's evaluation score is separate from package delivery.
49
-
50
- ## 0.7.11 — 2026-09-15
51
-
52
- Fix opportunity reporting that previously treated resolved API failures as
53
- successful submissions. Only `ok: true` confirms a report. HTTP errors remain
54
- unconfirmed; transport failures and exceptions have an unknown delivery outcome.
55
-
56
- `CycleResult.opportunity` now contains confirmed reports only. The additive
57
- `opportunityReport` field preserves the attempted payload, outcome and status,
58
- without API error bodies or exception details. Existing consumers should use
59
- this field when they need attempted rather than confirmed evidence.
60
-
61
- The reporter retains its one-invocation-per-cycle latch and adds no retries.
62
- Focused regressions compare successful and failed reporting in skip/act cycles
63
- and verify unchanged trading results and runner state. SDK versions are unchanged.
64
- This source entry does not establish registry publication or hosted deployment.
65
-
66
- ## 0.7.10 — 2026-09-15
67
-
68
- Source changes following the published 0.7.9 release. The TypeScript SDK remains
69
- 0.3.1 and Python remains 1.8.1; their runtime source is unchanged.
70
-
71
- - Persist file-backed run identity before execution so a first-cycle process
72
- crash cannot discard the idempotency identity. Transport uncertainty is still
73
- not automatically replayed or recorded as a completed trade.
74
- - Fix runner startup on Node 18: use the imported Node crypto API instead of
75
- depending on a global crypto object. The installed-package matrix reproduced
76
- this failure on Linux, Windows and macOS.
77
- - Add the supported `@coinrithm/mcp-trading/engine` entry point, preserving
78
- existing deep imports, and separate observation accounting and opportunity
79
- reporting from cycle ordering.
80
- - Add opt-in, machine-checked crypto return predicates and visible warnings for
81
- inactive/reserved configuration. Existing agents are not automatically opted in.
82
- - Serialize scheduler migrations in a bounded transaction; add an offline
83
- credential-rotation helper and interruption/recovery rehearsal.
84
- - Pin workflow actions and verify release-tool checksums. Add installed-package
85
- compatibility and restart smoke checks across operating systems and runtimes.
86
-
87
- 0.7.10 was published and deployed on 2026-09-15. Registry and GitHub downloads
88
- matched the CI-tested archive; hosted MCP and scheduler deployments finished.
89
- See the [release record](https://github.com/CoinRithm/coinrithm-agent-trading/releases/tag/mcp-trading-v0.7.10).
90
-
91
- ## 0.7.9 - 2026-09-15
92
-
93
- Published on npm and verified on 2026-09-15: the registry archive matches the
94
- reviewed artifact and passes fresh-install checks. See the
95
- [combined release notes](https://github.com/CoinRithm/coinrithm-agent-trading/releases/tag/mcp-trading-v0.7.9)
96
- for source provenance, verification and community acknowledgments.
97
-
98
- Public market-data fidelity and runner reliability release. No MCP tool was
99
- renamed or removed, and the API **contract stays 1.7.0**.
100
-
101
- **PM evaluation budget.** Event-driven periodic prediction-market evaluations
102
- now respect `maxLlmCallsPerHour` after their cooldown elapses. Budget skips make
103
- no provider call and consume no call allowance. PM keeps its own cooldown;
104
- open-position management and explicit always-on behavior retain their existing
105
- exemptions. This runner gate is separate from hosted provider-capacity admission.
106
-
107
- **Retry-After parsing.** Missing, blank or malformed headers no longer become
108
- zero-delay retries. The runner API client uses its existing five-second fallback;
109
- explicit zero, numeric seconds and HTTP dates remain supported. Model-provider
110
- cooldowns share the parser and retain their existing one-hour cap.
111
-
112
- **API request deadlines.** Each runner API operation now has a 30-second total
113
- deadline covering response headers, body reads and all 429 retry waits. The
114
- same client serves the hosted scheduler. Embedded callers can set a finite
115
- `requestTimeoutMs` and supply an `AbortSignal`. A timeout or cancellation returns
116
- an uncertain transport result without automatically replaying a trading write.
117
- Timers and listeners are removed when the operation finishes.
118
-
119
- **State persistence.** Self-host state is serialized to a private temporary file
120
- and atomically renamed over the previous state. A failed serialization or rename
121
- leaves the prior state intact. This is atomic replacement, not a claim of durable
122
- storage across power loss.
123
-
124
- **Agent conversion.** `coinrithm-agent eject` preserves explicit `triggerPolicy`
125
- and `capitalSizing` blocks. Previously conversion could restore default hourly
126
- budgets and drop equity sizing.
127
-
128
- **Release verification.** All-source coverage gates, mandatory PostgreSQL CI,
129
- dependency updates and corrected client setup docs are included. See the
130
- [reliability record](https://github.com/CoinRithm/coinrithm-agent-trading/blob/main/docs/RELIABILITY.md).
131
-
132
- **Confirmed-action journal.** Completed-action memory now requires an action
133
- to be both accepted and executed. Failed writes and uncertain transport results
134
- retain their attempt evidence without becoming completed moves in the next
135
- decision prompt. Dry-run proposals remain unexecuted.
136
-
137
- **Direct NVIDIA retry.** One complete HTTP 500/502/503/504 response can be
138
- retried once on the identical direct NVIDIA route within the original deadline.
139
- Both attempts are retained. This does not retry trading writes or change the
140
- hosted shared-pool routing policy.
141
-
142
- **Capital reconciliation.** Frozen-balance rounding residue down to -1e-8 is
143
- normalized only in the sizing calculation after the independent reads agree.
144
- Negative spendable cash still fails closed; wallet balances are not changed.
145
-
146
- **Private decision input evidence.** The bounded numeric projection includes
147
- nested indicator inputs and context movers, with legacy v1 records still readable.
148
- It does not retain hidden reasoning or raw model output.
149
-
150
- **Compact prediction-market evidence.** Discovery and compact event-detail
151
- responses now retain the API's `source.quoteScale`, `source.methodology` and
152
- `source.supportsMarketMetrics`, plus `spreadPoints`, `probabilityBook` and
153
- each retained outcome's `normalizedProbability`. Venue-native bid/ask quotes
154
- are never rescaled or interpreted from magnitude. Normalization remains the
155
- API's calculation over the original full book, not the truncated top-five
156
- outcome list. Existing payload bounds and explicit `detail: full` behavior
157
- are unchanged.
158
-
159
- **Settlement-time provenance.** Compact events retain `resolvedAtBasis` and
160
- `settlementWindowClosedAt`, keeping provider expiration distinct from an
161
- announced settlement time. Null and absent upstream evidence stay null and
162
- absent; the MCP does not infer missing values.
163
-
164
- **Candle semantics.** The `get_candles` description now states that these are
165
- sampled composite-price bars. Each bar's `v` is a mean rolling 24-hour
166
- quote-volume observation in USD, not volume traded during the candle, and
167
- must not be summed across bars.
168
-
169
- **HTTP completion diagnostics.** The hosted HTTP
170
- entry now has a bounded, stderr-only completion observer with final SDK-result
171
- and finish/abort accounting. Initialization, discovery, tool failures and
172
- successful delivery are distinct; unknown tool names are normalized. Records
173
- contain no arguments, bodies, credentials, caller/RPC IDs or caller-origin labels.
174
- Credential presence is not authentication. Durations describe the HTTP request,
175
- shared by batch members; server finish does not prove client receipt or use.
176
- Stdio, tools, authentication and dependency versions are unchanged. See
177
- `DEPLOY.md` for the measurement and retention limits. Hosted source/image
178
- `18a0bb6a8a0665e91cebc10225fec6f7ebcdaaf7` passed a bounded anonymous smoke on
179
- 2026-09-13. Hosted verification and npm publication are separate release steps.
180
-
181
- **Deployment boundaries.** Hosted scheduler admission reasons are private
182
- scheduler telemetry, not a new SDK or MCP response field. The API's corrected
183
- comparison probabilities and enriched spread names use the existing response
184
- shape and reach current clients through fresh API reads. Outcome display names
185
- may change; use source/event/outcome identifiers for identity, never summed
186
- prices or matching labels alone. These fixes do not establish trading returns.
187
-
188
- ## 0.7.8
189
-
190
- Runner decision-quality, evidence and paper-capital release. Additive: no MCP
191
- tool was renamed or removed, and the API **contract stays 1.7.0**. This release
192
- contains all package changes since published 0.7.7 (`gitHead` `80d0cae`), not
193
- just the previously listed thesis work.
194
-
195
- **Thesis exits.** Every opening action (`futures_open`, `spot_order`,
196
- `pm_open`) now carries a `thesis`: a one-sentence summary plus an
197
- `invalidation` with at least one machine-checkable condition (`priceBelow` /
198
- `priceAbove` for coins, `probabilityBelow` / `probabilityAbove` for prediction
199
- markets, a `maxHoldMinutes` time stop, and a free-text `catalyst` the model
200
- re-judges itself). The runner binds the thesis to the position the server
201
- returns, sanitized side-aware (a rising price never invalidates a long; a
202
- wrong-side level is dropped rather than re-signed; the time stop is clamped to
203
- 60 minutes .. 30 days), persists it in the run state (`RunState.theses`, the
204
- same state file / `agent_state` JSON as before, no schema change) and
205
- re-evaluates it every cycle. A futures position whose price level or time stop
206
- is breached is closed by the runner before the model is asked anything, logged
207
- as a `thesis_invalidated` exit with its own idempotency key, after the
208
- kill-switch and drawdown checks and never instead of them. Prediction-market
209
- positions have no close endpoint, so a broken PM thesis is surfaced to the
210
- model instead (do not add, let it settle). The parser is tolerant (a malformed
211
- thesis never fails the open; a thesis copied onto a close is ignored) and the
212
- structured-output schema requires it, so schema-enforced hosted models always
213
- emit one.
214
-
215
- **Fundamentals in the observation.** Each watch entry now carries
216
- `fundamentals` sourced only from calls the runner already makes: `categories`,
217
- `marketCapRank` and `marketCapUsd` from the market context; `volume24hUsd` from
218
- the candles the `indicators` capability already fetches (live-probed
219
- 2026-09-02: each bar's `v` is a rolling 24h volume, so the latest bar is the
220
- 24h figure, never the sum); and up to three `headlines` with `publishedAt`
221
- timestamps from the one `news` call, attributed through the curated coin-news
222
- graph. Discovered PM markets carry `endDate` and `liquidityUsd`; open PM
223
- positions carry their title, side, entry and current probability and
224
- `openedAt`; open futures positions carry `openedAt`. The system prompt states
225
- the thesis contract, the runner-enforced exit and how to grade a trade on the
226
- fundamentals. Not carried, because no agent endpoint serves them: an "about"
227
- text per coin, a 24h probability change and a cross-venue divergence per PM
228
- market.
229
-
230
- **Fix:** the public movers feed serializes `change24h` / `currentPrice` as
231
- decimal strings; the universe-scan context rows read them strictly as numbers
232
- and shipped `undefined` for every mover.
233
-
234
- **Opt-in equity-based paper sizing.** A runner can size entries from a
235
- conservative fraction of its independently attributed paper book instead of a
236
- fixed stake/margin. The book is accepted only when wallet identity, cash
237
- partitions, held-position attribution and spot-mark coverage reconcile. Quotes
238
- then enforce per-entry, per-symbol, deployed-capital and daily-entry limits;
239
- fee buffers and the API's fee-inclusive quote evidence are included. Any
240
- missing or inconsistent evidence fails closed. Legacy positions on a different
241
- book remain visible for management but never inflate the current book's buying
242
- power.
243
-
244
- **Prediction-market decisions use executable economics.** PM opens now reject
245
- an invalid raw probability and a model forecast that does not clear the quoted
246
- entry price. Forecast edge is measured against the actual fee/slippage-adjusted
247
- fill, not the headline market probability. Quote-expiry outcomes are recorded
248
- separately from risk/balance rejection, and futures risk/reward validation uses
249
- fee-inclusive entry and stop economics.
250
-
251
- **Decision evidence is structured and bounded.** Cycles can expose a sanitized,
252
- partial private decision-input record: configuration and observation
253
- fingerprints, daily budget and guard state, plus bounded observation rows with
254
- explicit omission counts. It is not a prompt, transcript, raw model output or
255
- hidden reasoning record. The runner also reports quote/validation evidence for
256
- abstained, forecast-only and quote-expired PM opportunities. Hosted persistence
257
- and retention remain the caller's responsibility.
258
-
259
- **Runtime controls are more faithful.** The model sees the remaining daily
260
- entry/add budget rather than only static maxima. Entry caps still block new
261
- risk, while closes and other risk-reducing actions remain available. Direct
262
- provider HTTP 429 responses are capacity skips rather than model failures, so
263
- BYO agents do not build a failure streak during ordinary quota pressure.
264
- Structured-tool decisions remain required where the provider supports that
265
- contract.
266
-
267
- **Scorecard fix.** Maximum drawdown now measures decline from starting equity,
268
- so an immediate loss is no longer hidden by treating the first post-trade point
269
- as the high-water mark.
270
-
271
- ## 0.7.7
272
-
273
- Reliability release. Every change here came from a live production failure, not
274
- from a roadmap. Additive: no tool renamed or removed, and the API **contract
275
- stays 1.7.0** because nothing on the documented surface changed.
276
-
277
- **Model requests are now built from a declared capability table, not
278
- assumptions.** `providerCapabilities.ts` states, per model family, which
279
- parameter carries the completion budget, whether a non-default temperature is
280
- allowed, and what extra body fields the family needs. Two failures this fixes:
281
-
282
- - **OpenAI's current models rejected our requests outright.** `gpt-5*` and
283
- `o*` refuse `max_tokens` and any non-default `temperature`; they take
284
- `max_completion_tokens`. The family is detected by MODEL id, not just the
285
- provider name, so an OpenAI-compatible gateway serving `gpt-5` gets the same
286
- shape. If you brought your own OpenAI key, this is why it now works.
287
- - **NVIDIA Nemotron models emitted a think-chain where the JSON decision
288
- belonged**, which failed every cycle. The `chat_template_kwargs.enable_thinking=false`
289
- switch and the "detailed thinking off" system hint are now encoded as data
290
- rather than re-learned by failing.
291
-
292
- **New: `probeDecisionContract()`.** An HTTP 200 is not proof a route can run an
293
- agent. Both production failure modes returned 200s: a think-chain in the JSON
294
- slot, and an empty completion because a reasoning model spent its whole budget
295
- before answering. The probe sends a canned mini-observation through the REAL
296
- decision parser at a >=1024 completion allowance and classifies the result as
297
- `http`, `empty` or `parse`. Use it before adopting any model id; provider
298
- catalogs list ids that 404 on invoke.
299
-
300
- **Provider trouble no longer disables an agent.** A permanent-looking model
301
- error (404/410/decommissioned) used to disable the agent after a threshold. On
302
- 2026-08-26 NVIDIA end-of-lifed an entire model line and 35 agents died on that
303
- path. The runner now reports a hold and keeps retrying each cadence, recovering
304
- by itself when the provider does. Disables remain for what deserves them:
305
- revoked credentials, drawdown, kill-switch, user action.
306
-
307
- **Failures carry structured metadata.** A failed `decide()` now returns
308
- `status` and, when the provider sends one, `retryAfterMs` (parsed from
309
- `Retry-After` in both delta-seconds and HTTP-date form, capped at an hour), so
310
- a caller can tell a 429 from a 5xx without parsing strings. Error text is
311
- unchanged.
312
-
313
- **`ClientConfig.extraHeaders`.** Headers attached to every request, spread
314
- before auth so they can never clobber it. Self-host has nothing to put here;
315
- it exists so CoinRithm's own hosted scheduler can present its attestation
316
- channel.
317
-
318
- **Model names corrected throughout.** The retired Llama 3.x line is gone from
319
- the README, the runtime defaults and the `quant-reference` example, which is
320
- relocked onto `nvidia/nemotron-3-nano-30b-a3b`.
321
-
322
- ## 0.7.6
323
-
324
- Agent capability release: universe discovery, first-class behavioral guards,
325
- and the hosted prose budget made visible. Additive — no tool renamed or
326
- removed. Contract moves to **1.7.0** (two keyless paths declared).
327
-
328
- **New: agents can look beyond their own watchlist.**
329
-
330
- - **`get_crypto_movers` tool.** Keyless scan of the tracked coin universe for
331
- the biggest 24h gainers or losers. Rows carry `coinId`, `symbol`, `name`,
332
- `slug`, `change24hPct`, `priceUsd`.
333
- - **`universe_scan` capability** for the self-host runner. Each cycle it pulls
334
- the top movers, promotes the strongest few into full watch entries marked
335
- `discovered: true`, and passes the remainder as compact context. Watchlist
336
- and blocklist symbols are excluded up front, so a discovered row can never
337
- duplicate a configured pair or bypass the deny list.
338
- - **Both now carry the coinId through.** The movers row's `ucid` IS the
339
- `coinId` that `get_candles` / `get_market_context` / the futures quote path
340
- take. It was previously stripped from the tool response and re-derived from
341
- the SYMBOL via a resolve round-trip — a wasted call per discovered mover and
342
- a real correctness hazard, because symbols collide across listings and the
343
- resolver could return a different coin than the one that actually moved.
344
-
345
- **New: contract declares the endpoints the tools call.**
346
-
347
- - `/api/coins/top-gainers` and `/api/coins/top-losers` are now in
348
- `openapi.yaml` (tag `public-crypto-data`), so both SDKs can reach the
349
- surface `get_crypto_movers` uses. Probe-verified against prod: bare array,
350
- no envelope; `change24h` / `currentPrice` are decimal STRINGS; default
351
- `limit` is 3 and out-of-range values return 400 rather than clamping.
352
-
353
- **New: personality and boundaries are configurable, and documented.**
354
-
355
- - **`character/guards.md`** — first-class hard behavioral guards, merged into
356
- the strategy prose as a distinct section rather than buried in the thesis.
357
- - **`examples/agents/pia-pump-fader`** — a full bundle demonstrating
358
- capabilities plus boundary configuration (watchlist/blocklist interaction,
359
- the five-point risk gate, re-entry discipline).
360
- - **`examples/agents/FORKING.md`** — a file-by-file map of what is strategy
361
- and what is plumbing, so a fork knows what it is allowed to change.
362
- - **QUICKSTART** documents capabilities, and a docs-drift tripwire fails the
363
- suite when a capability ships undocumented (`universe_scan` shipped
364
- invisible in every user surface once; that cannot recur silently).
365
-
366
- **Fixed.**
367
-
368
- - **Hosted prose budget is validated, not discovered at deploy.**
369
- `coinrithm-agent validate --hosted` now checks the 8,000-character merged
370
- prose budget and reports the exact overage. A bundle could previously
371
- validate clean and still be undeployable. YAML frontmatter is stripped
372
- before the count (and before the model sees it — it was being fed in as if
373
- it were strategy). `pia-pump-fader` was rebuilt to fit at 7,932.
374
- - **Permanent failures stop being revived.** A disabled agent whose model is
375
- gone or whose key is invalid is no longer resurrected by the scheduler's
376
- revive pass; only transient failures are retried.
377
- - **Fresh scaffolds are no longer bricked** by the capabilities field, and
378
- action-confidence tolerance was widened to match what models actually emit.
379
- - **False market-data licensing assertion corrected** in both READMEs.
380
-
381
- ⚠ Publishing to npm remains a **manual** step — `publish-mcp.yml` pushes
382
- `server.json` to the MCP registry only.
383
-
384
- ## 0.7.5
385
-
386
- **Release-hygiene bump. Everything below was already merged but never
387
- reached npm** — the 0.7.4 tarball was published 2026-07-26T23:01:11Z and
388
- five commits landed after that instant without a version bump, so the
389
- repository's 0.7.4 and the published 0.7.4 were different code under one
390
- version number. This release makes the published artifact match the
391
- source again.
392
-
393
- - **Security.** MCP dependency audit fixes, 6 findings to 0 (`da65e9e`).
394
- Anyone on published 0.7.4 is running the pre-audit dependency set.
395
- - **`pm_data` Gemini exposure** for agents (`3ab04ae`).
396
- - **Venue methodology and health** exposed as tools (`74cc495`).
397
- - **Reproducible decision receipts** persisted by the agent runner
398
- (`8bebc9e`).
399
- - **Docs.** Contract version drift corrected and the placeholder SDK
400
- README replaced, so the docs stop advertising an install that 404s
401
- (`6d61b92`).
402
-
403
- No tool was renamed or removed; this is additive plus a dependency
404
- refresh.
405
-
406
- ⚠ Publishing this package is a **manual** step — `publish-mcp.yml` only
407
- pushes `server.json` to the MCP registry, it does not run `npm publish`.
408
- That asymmetry is exactly how the drift above accumulated unnoticed.
409
-
410
- ## 0.7.4
411
-
412
- Docs-only. No tool behavior change, no API-surface change.
413
-
414
- - **Acceptable Use of Market Data.** The README (root and this package) and
415
- `openapi.yaml` (`info.termsOfService`, `info.description`, and the
416
- `public-pm-data` tag) now reference and summarize CoinRithm's licensing
417
- flow-down restriction on Market Data from third-party prediction-market
418
- venues: read-only use for paper-trading context and settled-outcome
419
- scoring only — no model training/fine-tuning/benchmarking, no
420
- redistribution or bulk-extraction, no use to build a competing product.
421
- Full terms: <https://www.coinrithm.com/en/terms-of-use>
422
-
423
- ## 0.7.3
424
-
425
- Quality-engine surfaces + independent forecasts. Additive; no breaking change.
426
-
427
- - **Quality verdicts in tool responses.** `discover_pm_markets`, `pm_quote`, and
428
- the `pm_data_*` tools now surface the persisted truth-engine `quality` object
429
- (`decisionEligible`, warning/block reason codes, `policyVersion`, `assessedAt`).
430
- Markets with critical failures stay visible but cannot drive paper opens or
431
- alerts.
432
- - **`openBlocked` preview on `pm_quote`.** Quotes preview the open-time quality
433
- gate (`openBlocked` + `openBlockReasons`), so an agent can skip a market that
434
- would 422 before burning the open attempt. The self-host runner
435
- (`coinrithm-agent`) does this skip automatically.
436
- - **Independent forecasts in the runner.** The self-host agent runner elicits the
437
- model's OWN probability (judged from the question/resolution criteria/deadline,
438
- never anchored to the market price) and submits it as `forecastProbability` on
439
- PM opens — feeding the public calibration dataset with proper-scoring-rule
440
- forecasts. Clamped to [1,99]; omitted (never faked) when the model does not
441
- produce one; `HOUSE_AGENT_FORECAST_ENABLED=false` disables.
442
- - **`crossPlatform` on event lists** documented in the API contract: sibling
443
- venues pricing the same question, on list rows.
444
- - **ForecastEx venue truth.** Public MCP discovery copy and registry metadata
445
- now describe all 11 live venues, including ForecastEx.
446
- - **Contract synchronization.** Runner templates and example bundles pin the
447
- served OpenAPI 1.6.0 contract; canonical scorecard paths are unambiguous.
448
-
449
- ## 0.7.2
450
-
451
- Docs-truth + privacy release. No tool behavior change, no API-surface change.
452
-
453
- - **Ten venues in the public listing.** `pm_data_*` tool copy, the README, and
454
- `server.json` now name all ten venues (adds Futuur and Myriad). npm `0.7.1` was
455
- published before those landed, so the registry listing still advertised "eight
456
- venues"; npm versions are immutable, so correcting the public listing required
457
- a new release.
458
- - **`source` parameter description** on `pm_data_events` / `pm_data_event_detail`
459
- now enumerates all ten venue slugs. Accepted values are unchanged — this is
460
- description text only, which is why it is a patch and not a minor.
461
- - **Privacy.** Raw model output is no longer persisted, enforcing the package's
462
- no-chain-of-thought promise.
463
- - **New tripwire.** `server.json` (the MCP-registry listing) is now guarded
464
- against version and venue-count drift; it had no guard, which is how it went
465
- stale in the first place.
466
- - Refreshed stale Arena-gate example copy.
467
-
468
- ## 0.7.1
469
-
470
- Docs + registry-metadata release; no tool behavior changes.
471
-
472
- - **README refresh**: the keyless `pm_data_*` data surface is now front and
473
- center — 8 venues (Polymarket, Kalshi, Smarkets, Limitless, Manifold,
474
- Metaculus, PredictIt, Rothera — the "seven venues" line predated Rothera),
475
- the anonymous hosted-endpoint path, and the `referenceProbability` /
476
- `volumeHistory` fields the data tools return.
477
- - **`server.json`**: hosted endpoint's `Authorization` header marked optional
478
- (the `pm_data_*` tools work anonymously — verified live) and the server
479
- description now leads with the keyless data surface.
480
- - Ships the post-0.7.0 commits: `pm_data_event` advertises `volumeHistory`,
481
- `pm_data_events` advertises `referenceProbability` on list items, and the
482
- hosted MCP root (`GET /`) serves a self-describing JSON landing (with a
483
- 405 + hint on `GET /mcp`).
484
-
485
- ## 0.7.0
486
-
487
- (Retroactive entry — released 2026-07-05 without a changelog note.)
488
-
489
- - **Four keyless `pm_data_*` tools** — CoinRithm's free public cross-venue
490
- prediction-market dataset over MCP, no API key required and yours is never
491
- attached: `pm_data_overview` (market-wide stats), `pm_data_events`
492
- (cross-venue event list), `pm_data_event` (detail incl.
493
- `crossSourceMatches` + resolution evidence), `pm_data_whales`
494
- (large-trade tape).
495
-
496
- ## 0.5.0
497
-
498
- Agent-runner quality + reliability release. `coinrithm-agent` got materially
499
- smarter and less noisy; `coinrithm-mcp` is unchanged in shape. Bundles the work
500
- since 0.4.0.
501
-
502
- - **Prediction markets are a first-class venue** in the decide prompt: a short
503
- `pmN` ref so small models trade PM reliably, eligible-outcome filtering (only
504
- backend-openable outcomes reach the model), and futures-capped agents steered
505
- to PM (a separate budget) instead of re-rejecting.
506
- - **PM anti-churn — now actually effective.** The candidate list is pre-filtered
507
- to exclude markets the agent already holds, and the runner + server both block
508
- re-betting a held market+outcome (no more one-agent, 25-identical-bets churn).
509
- An earlier version read the wrong `/positions/pm` fields and was silently dead;
510
- fixed.
511
- - **Settlement-feedback learning loop.** The agent sees how its own recent bets
512
- actually resolved (win/loss/void + realized PnL) as reflective context, so it
513
- learns from outcomes across cycles.
514
- - **Per-trade reasoning stays honest about the market.** A multi-action decision
515
- no longer stamps its primary rationale onto a secondary trade about a different
516
- market — the trade's public Arena "why" always matches the market it's on.
517
- - **Futures reliability.** The model is unblinded to per-position mark /
518
- liquidation / stop / take-profit prices; take-profit is auto-clamped to a valid
519
- R:R target off the stop (kills the `take_profit_not_*_mark` reject waves); and a
520
- marking-down PM book now trips the equity-drawdown kill-switch too.
521
- - **News capability.** Recent high-importance news for the watchlist coins is fed
522
- into the decide context as a market-catalyst layer.
523
- - **Robustness + contract accuracy.** Scheduler/runner hardening, flat-state
524
- prompt steers (weak models stop hallucinating closes), manage-enum
525
- normalization, and the PM contract now documents real entry friction rather
526
- than a disclose-only stance.
527
- - **Security.** `hono` bumped to 4.12.27 (high-severity advisories: serve-static
528
- path traversal, CORS wildcard-with-credentials, body-limit bypass).
529
- - **Docs.** The npm README leads with value / free / OKF / Studio; stale
530
- scheduler and `minDecidedTrades` claims corrected.
531
-
532
- ## 0.4.0
533
-
534
- - **Deterministic scorecard engine (`computeScorecard`).** The reproducible-
535
- evaluation engine for `coinrithm.agent.scorecard.v1` — pure math over an
536
- agent's realized track record (no network, no model): realized PnL, win rate,
537
- expectancy, profit factor, reward-to-risk, Sharpe, Sortino, deflated /
538
- probabilistic Sharpe (Bailey & López de Prado — skill vs luck with a multiple-
539
- testing penalty), max drawdown, and Brier + ECE calibration for probabilistic
540
- calls. Same inputs → identical metrics **and** a sha256 `contentHash` of the
541
- canonicalized result, so a scorecard whose hash doesn't reproduce isn't
542
- trusted. Metrics are computed AFTER the run from immutable evidence (leakage-
543
- separation), so tuning-to-the-metric is structurally impossible. Returns
544
- `null` for thin records — never a fabricated number.
545
- - **Resolver: committable file metadata + functionality pin.** The OKF resolver
546
- now carries per-file metadata and pins functionality through resolution, so a
547
- bundle's behavior is reproducible from its committed files.
548
-
549
- ## 0.3.0
550
-
551
- - **Agent risk config: coin deny-list (`blocklist`).** `risk.blocklist` lets an
552
- agent name symbols it must never open, even if they are on the watchlist —
553
- deny wins over allow. Enforced in the runner's decision validator (rejects
554
- `futures_open` / `spot_order` on a denied symbol) and surfaced in the system
555
- prompt, so the model is told the boundary and the runner re-checks it.
556
- - **Docs: Open Knowledge Format positioning.** Clarified that a CoinRithm agent
557
- is an OKF bundle — a portable directory of markdown + frontmatter that is
558
- model-agnostic (run the same definition on any model). Develop and prove it
559
- free on paper, then run it anywhere.
560
- - npm keywords refreshed (`open-knowledge-format`, `okf`, `model-agnostic`,
561
- `gemini`) for registry discovery.
562
-
563
- ## 0.2.0
564
-
565
- - Added the **`coinrithm-agent`** self-host runner binary alongside the MCP
566
- server: a folder-as-architecture (OKF) agent you bring your own model key to,
567
- with caps enforced by the runner (not the model), dry-run by default,
568
- paper-only.
569
-
570
- ## 0.1.x
571
-
572
- - Initial `coinrithm-mcp` MCP server: reads, quotes, scoped spot/futures/PM
573
- writes, ledger export, and Agent Arena integration over a user-minted API key.
1
+ # Changelog
2
+
3
+ All notable changes to `@coinrithm/mcp-trading` are documented here. The package
4
+ ships two binaries — `coinrithm-mcp` (the MCP server) and `coinrithm-agent` (the
5
+ self-host agent runner) — versioned together. The CoinRithm **API contract** is
6
+ versioned separately (see `openapi.yaml` `info.version`, currently `1.7.0`).
7
+
8
+ ## 0.7.15 (current source, not yet published)
9
+
10
+ These notes include source changes through 1 October 2026. The frozen
11
+ September 28 draft archives omit later changes and must be replaced with a
12
+ new reviewed artifact set before this complete release is uploaded.
13
+
14
+ - PM board rows carry event settlement context from discovery's optional
15
+ `resolution`. Where `scope` is `per_outcome`, each row also carries its own
16
+ provider-bound `outcomeRule`, preserving exact primary/secondary terms or
17
+ explicit unknown status. Event-level text does not substitute for another
18
+ outcome's rule. Missing fields on older APIs remain unknown.
19
+ - Futures agents see `futuresCapacity` in the user prompt: open vs maximum
20
+ positions, slots left and margin headroom, computed exactly as the runner
21
+ validates. With no slot or no margin left, the prompt says plainly that no
22
+ futures_open (new or add) can pass. Production showed agents at 3 of 3
23
+ positions proposing a new open on most cycles (max_positions 222 and
24
+ open_margin_exceeds_cap 116 rejections in 6h), each a wasted model call.
25
+ The validator still enforces both caps.
26
+ - The PM system prompt no longer claims a "genuine information edge" on crypto
27
+ price markets or makes a PM bet REQUIRED. It says the market already prices
28
+ the same public data, that short-dated price markets are usually efficient,
29
+ and that a bet needs a probability gap larger than costs plus a named reason;
30
+ skipping PM is always valid. The ref anti-hallucination rule is unchanged.
31
+ - Every non-mechanical agent (not only `objective.primary: calibration`) gets
32
+ the micro-contract churn filter and the deeper 30-row discovery page,
33
+ including the Bitcoin fallback. Mechanical baselines keep the unmodified
34
+ 12-row universe.
35
+ - PM board rows carry the discover event's optional `referenceProbability` as
36
+ event-level `consensus` (`prob` 0..1, `venues`, `spreadPts`, `kind`,
37
+ `outcome`), never mapped to or flipped for a specific outcome. Absent or
38
+ unusable stays unknown.
39
+ - Non-mechanical PM agents see their own settled forecast record
40
+ (`pmCalibration` from `GET /api/agent/performance`) when it has at least 20
41
+ settled forecasts. It is read at most once per 30 minutes per credential,
42
+ without retries, and omitted on any failure.
43
+
44
+ - Preflight new futures entries using informational reference eligibility;
45
+ validate the available position and margin capacity across actions in the
46
+ same cycle. Adds/exits retain their separate rules, and the API rechecks
47
+ execution-time eligibility. Preserve reported capacity and spot fill
48
+ receipts in decision evidence without claiming full historical replay.
49
+ - Describe forecasts as market-aware, not price-blinded. A capacity-limited
50
+ agent may still exit or adjust protection. Withheld-action diagnostics are
51
+ attributed to the provider response that produced them.
52
+ - Add `get_news` for scored crypto news, bringing the source MCP surface to
53
+ 41 tools. Arena reads work without a key; discovery defaults to open
54
+ markets. Default event results remain compact, with `detail: "full"` for
55
+ the complete event response. Preserve event subtitles and per-outcome
56
+ price basis in bounded output.
57
+
58
+ - The hosted HTTP server recovers the pasted-markdown descriptor link
59
+ (`/mcp` followed by `](`, literal or percent-encoded): GET/HEAD redirect to
60
+ the service descriptor and POST runs the same MCP handler as `POST /mcp`.
61
+ Every other unknown path stays 404 and `GET /mcp` stays 405.
62
+ - `pm_data_canonical` documents the canonical `consensus` (or null) and the
63
+ labelled `consensusHistory`, and names orientation `flipped` as the API does.
64
+
65
+ - Preserve optional observed-price flags and bounded source provenance in public
66
+ market summaries, including the exact sides of venue comparisons. A missing
67
+ observed price remains distinct from an observed zero and unknown provenance.
68
+ This source change is not included in published npm `0.7.14`.
69
+
70
+ - Hosted scheduler rollout supports the opt-in `whale_context` runner capability. After the deterministic
71
+ gate fires for a PM-scoped, non-mechanical cycle, it attaches bounded public
72
+ tape context and up to two validated wallet movement summaries to the
73
+ observation. Reads are best effort with explicit availability status and do
74
+ not widen candidates or change risk/write gates. The observation fingerprint
75
+ includes this context; the existing partial persisted audit projection does
76
+ not store raw whale or wallet samples. Published MCP `0.7.14` remains unchanged.
77
+
78
+ - Preserve full public `walletAddress` values in whale tape and default event
79
+ summaries for direct wallet-tool follow-up on Polymarket, Limitless and Myriad.
80
+ Anonymous/null and absent identities remain unchanged. This source fix is not
81
+ included in the published npm `0.7.14` package.
82
+ - Record explicit zero model calls, tokens, inference cost and action writes for
83
+ cycles that return before inference due to a kill switch, observed drawdown,
84
+ failed account reads or an empty market selection. Historical records remain
85
+ unchanged; failures after a possible provider call retain unknown evidence.
86
+
87
+ ## 0.7.14
88
+
89
+ - Scope permanent model-error streaks to the attempted provider/model. Discard
90
+ legacy unattributed streaks and reset availability failures on a successful
91
+ provider response, including malformed decisions. Old-route failures cannot
92
+ request an early hold on a replacement model; agent risk limits are unchanged.
93
+ - Attribute a routed permanent-error hold to the attempt that produced the error,
94
+ even when a later fallback is rate-limited; keep actual-call metering unchanged.
95
+ - Preflight futures protection updates against observed side, mark and liquidation
96
+ prices, including retained triggers. Reject known invalid end-states with an
97
+ actionable reason before a write; the API remains authoritative as prices move.
98
+ - Add the optional `risk.pmMinEntryProbabilityPct` policy (0..100 points): the
99
+ runner rejects `pm_open` when the chosen outcome's raw market probability at
100
+ entry is below the floor, with a reason that names both numbers. Fees stay
101
+ in the forecast-edge check, so a 19-point outcome fails a 20-point floor even
102
+ when fees lift its cost above 20. Absent keeps today's behaviour; a set floor
103
+ with no quoted probability fails closed. The floor is rendered in the prompt's
104
+ hard caps.
105
+ - Retain candle timestamps and compact coverage/interval evidence alongside
106
+ indicators, separately from market-price freshness. Missing timestamps stay
107
+ unknown; nominal five-minute cadence does not imply current or regular bars.
108
+ Model input and private decision evidence retain the same context.
109
+ - Load optional `character/entries.md`, `exits.md`, `sizing.md` and `research.md`
110
+ from local bundles so Studio strategy sections reach the model, manifest and
111
+ compiled definition. Existing bundles without these files are unchanged.
112
+ - Include the exact compiled strategy definition and its digest in local
113
+ inspection; expose the same snapshot builder to engine consumers.
114
+ - Add `run --expect-definition` to reject a changed baseline before model or
115
+ account access. The digest is not a full replay record or broker adapter.
116
+ - Hosted validation accepts `limits.maxDailyLossMusd: 0` as no daily loss cap,
117
+ matching the runner and the hosted API; negative and non-finite values are
118
+ still rejected.
119
+ - Tactic cap merges treat 0 as unlimited for `maxTradesPerDay` and
120
+ `maxDailyLossMusd`: a tactic may tighten 0 to a positive cap but can no
121
+ longer turn a positive cap into 0. Writes and margins keep lower-is-tighter.
122
+
123
+ Publication and hosted deployment are verified separately. See the repository's
124
+ [release status](https://github.com/CoinRithm/coinrithm-agent-trading#version-clarity)
125
+ for registry availability and the hosted runtime evidence.
126
+
127
+ ## 0.7.13
128
+
129
+ - Preserve optional per-outcome venue terms in compact prediction-market output,
130
+ including explicit unavailable values and valid false/zero facts.
131
+ - Include candle volume coverage in agent fundamentals: positive counts identify
132
+ missing expected venues; unknown coverage stays unknown. Preserve measured zero
133
+ volume and keep each volume paired with its own coverage.
134
+ - Classify provider capacity failures consistently, including HTTP 503
135
+ resource exhaustion, in runner results and configured same-model retries.
136
+ - Export `classifyProviderFailure` from the supported engine entry point.
137
+ Retry counts and trading behavior are unchanged.
138
+ - Surface signed cumulative futures funding and its applied-through timestamp to
139
+ the agent observation so funding already reflected in balances is not counted twice.
140
+ - Add public whale-wallet context to the 40-tool surface: bounded 7-day or
141
+ 30-day wallet activity and source/wallet movement detail, with provenance and
142
+ provider-reported context kept distinct from CoinRithm's observed trade flow.
143
+ - Clarify `pm_data_calibration` as market-price calibration: the primary lane
144
+ uses one complete-book snapshot in the inclusive 20–28 hour pre-resolution
145
+ window, with event-weighted ECE and separate `finalPrice`/`ownCapture` lanes.
146
+
147
+ Publication and hosted deployment are verified separately. See the repository's
148
+ [release status](https://github.com/CoinRithm/coinrithm-agent-trading#version-clarity)
149
+ for registry availability and the hosted runtime evidence.
150
+
151
+ ## 0.7.12 — 2026-09-15
152
+
153
+ Clarify `whoami`, `cancel_spot_order` and `report_pm_opportunity` descriptions,
154
+ removing execution-cost prose unrelated to these operations. Document actual
155
+ authentication, side effects, result fields and retry behavior.
156
+
157
+ Spot cancellation now advertises its existing idempotent behavior. Opportunity
158
+ reporting no longer advertises unconditional idempotency: duplicate protection
159
+ requires `decisionId` (or `agentTrace.decisionId`) under the same API key; the
160
+ first stored record wins. Reporting remains a write despite requiring only the
161
+ `read` scope, and its evidence remains explicitly self-reported.
162
+
163
+ Tool names, accepted inputs and execution behavior are unchanged. Published on
164
+ npm and deployed to hosted MCP on 2026-09-15; registry and GitHub downloads match
165
+ the CI archive. A clean registry installation passed startup and tool metadata
166
+ checks. See the [release record](https://github.com/CoinRithm/coinrithm-agent-trading/releases/tag/mcp-trading-v0.7.12).
167
+ Glama's evaluation score is separate from package delivery.
168
+
169
+ ## 0.7.11 — 2026-09-15
170
+
171
+ Fix opportunity reporting that previously treated resolved API failures as
172
+ successful submissions. Only `ok: true` confirms a report. HTTP errors remain
173
+ unconfirmed; transport failures and exceptions have an unknown delivery outcome.
174
+
175
+ `CycleResult.opportunity` now contains confirmed reports only. The additive
176
+ `opportunityReport` field preserves the attempted payload, outcome and status,
177
+ without API error bodies or exception details. Existing consumers should use
178
+ this field when they need attempted rather than confirmed evidence.
179
+
180
+ The reporter retains its one-invocation-per-cycle latch and adds no retries.
181
+ Focused regressions compare successful and failed reporting in skip/act cycles
182
+ and verify unchanged trading results and runner state. SDK versions are unchanged.
183
+ This source entry does not establish registry publication or hosted deployment.
184
+
185
+ ## 0.7.10 — 2026-09-15
186
+
187
+ Source changes following the published 0.7.9 release. The TypeScript SDK remains
188
+ 0.3.1 and Python remains 1.8.1; their runtime source is unchanged.
189
+
190
+ - Persist file-backed run identity before execution so a first-cycle process
191
+ crash cannot discard the idempotency identity. Transport uncertainty is still
192
+ not automatically replayed or recorded as a completed trade.
193
+ - Fix runner startup on Node 18: use the imported Node crypto API instead of
194
+ depending on a global crypto object. The installed-package matrix reproduced
195
+ this failure on Linux, Windows and macOS.
196
+ - Add the supported `@coinrithm/mcp-trading/engine` entry point, preserving
197
+ existing deep imports, and separate observation accounting and opportunity
198
+ reporting from cycle ordering.
199
+ - Add opt-in, machine-checked crypto return predicates and visible warnings for
200
+ inactive/reserved configuration. Existing agents are not automatically opted in.
201
+ - Serialize scheduler migrations in a bounded transaction; add an offline
202
+ credential-rotation helper and interruption/recovery rehearsal.
203
+ - Pin workflow actions and verify release-tool checksums. Add installed-package
204
+ compatibility and restart smoke checks across operating systems and runtimes.
205
+
206
+ 0.7.10 was published and deployed on 2026-09-15. Registry and GitHub downloads
207
+ matched the CI-tested archive; hosted MCP and scheduler deployments finished.
208
+ See the [release record](https://github.com/CoinRithm/coinrithm-agent-trading/releases/tag/mcp-trading-v0.7.10).
209
+
210
+ ## 0.7.9 - 2026-09-15
211
+
212
+ Published on npm and verified on 2026-09-15: the registry archive matches the
213
+ reviewed artifact and passes fresh-install checks. See the
214
+ [combined release notes](https://github.com/CoinRithm/coinrithm-agent-trading/releases/tag/mcp-trading-v0.7.9)
215
+ for source provenance, verification and community acknowledgments.
216
+
217
+ Public market-data fidelity and runner reliability release. No MCP tool was
218
+ renamed or removed, and the API **contract stays 1.7.0**.
219
+
220
+ **PM evaluation budget.** Event-driven periodic prediction-market evaluations
221
+ now respect `maxLlmCallsPerHour` after their cooldown elapses. Budget skips make
222
+ no provider call and consume no call allowance. PM keeps its own cooldown;
223
+ open-position management and explicit always-on behavior retain their existing
224
+ exemptions. This runner gate is separate from hosted provider-capacity admission.
225
+
226
+ **Retry-After parsing.** Missing, blank or malformed headers no longer become
227
+ zero-delay retries. The runner API client uses its existing five-second fallback;
228
+ explicit zero, numeric seconds and HTTP dates remain supported. Model-provider
229
+ cooldowns share the parser and retain their existing one-hour cap.
230
+
231
+ **API request deadlines.** Each runner API operation now has a 30-second total
232
+ deadline covering response headers, body reads and all 429 retry waits. The
233
+ same client serves the hosted scheduler. Embedded callers can set a finite
234
+ `requestTimeoutMs` and supply an `AbortSignal`. A timeout or cancellation returns
235
+ an uncertain transport result without automatically replaying a trading write.
236
+ Timers and listeners are removed when the operation finishes.
237
+
238
+ **State persistence.** Self-host state is serialized to a private temporary file
239
+ and atomically renamed over the previous state. A failed serialization or rename
240
+ leaves the prior state intact. This is atomic replacement, not a claim of durable
241
+ storage across power loss.
242
+
243
+ **Agent conversion.** `coinrithm-agent eject` preserves explicit `triggerPolicy`
244
+ and `capitalSizing` blocks. Previously conversion could restore default hourly
245
+ budgets and drop equity sizing.
246
+
247
+ **Release verification.** All-source coverage gates, mandatory PostgreSQL CI,
248
+ dependency updates and corrected client setup docs are included. See the
249
+ [reliability record](https://github.com/CoinRithm/coinrithm-agent-trading/blob/main/docs/RELIABILITY.md).
250
+
251
+ **Confirmed-action journal.** Completed-action memory now requires an action
252
+ to be both accepted and executed. Failed writes and uncertain transport results
253
+ retain their attempt evidence without becoming completed moves in the next
254
+ decision prompt. Dry-run proposals remain unexecuted.
255
+
256
+ **Direct NVIDIA retry.** One complete HTTP 500/502/503/504 response can be
257
+ retried once on the identical direct NVIDIA route within the original deadline.
258
+ Both attempts are retained. This does not retry trading writes or change the
259
+ hosted shared-pool routing policy.
260
+
261
+ **Capital reconciliation.** Frozen-balance rounding residue down to -1e-8 is
262
+ normalized only in the sizing calculation after the independent reads agree.
263
+ Negative spendable cash still fails closed; wallet balances are not changed.
264
+
265
+ **Private decision input evidence.** The bounded numeric projection includes
266
+ nested indicator inputs and context movers, with legacy v1 records still readable.
267
+ It does not retain hidden reasoning or raw model output.
268
+
269
+ **Compact prediction-market evidence.** Discovery and compact event-detail
270
+ responses now retain the API's `source.quoteScale`, `source.methodology` and
271
+ `source.supportsMarketMetrics`, plus `spreadPoints`, `probabilityBook` and
272
+ each retained outcome's `normalizedProbability`. Venue-native bid/ask quotes
273
+ are never rescaled or interpreted from magnitude. Normalization remains the
274
+ API's calculation over the original full book, not the truncated top-five
275
+ outcome list. Existing payload bounds and explicit `detail: full` behavior
276
+ are unchanged.
277
+
278
+ **Settlement-time provenance.** Compact events retain `resolvedAtBasis` and
279
+ `settlementWindowClosedAt`, keeping provider expiration distinct from an
280
+ announced settlement time. Null and absent upstream evidence stay null and
281
+ absent; the MCP does not infer missing values.
282
+
283
+ **Candle semantics.** The `get_candles` description now states that these are
284
+ sampled composite-price bars. Each bar's `v` is a mean rolling 24-hour
285
+ quote-volume observation in USD, not volume traded during the candle, and
286
+ must not be summed across bars.
287
+
288
+ **HTTP completion diagnostics.** The hosted HTTP
289
+ entry now has a bounded, stderr-only completion observer with final SDK-result
290
+ and finish/abort accounting. Initialization, discovery, tool failures and
291
+ successful delivery are distinct; unknown tool names are normalized. Records
292
+ contain no arguments, bodies, credentials, caller/RPC IDs or caller-origin labels.
293
+ Credential presence is not authentication. Durations describe the HTTP request,
294
+ shared by batch members; server finish does not prove client receipt or use.
295
+ Stdio, tools, authentication and dependency versions are unchanged. See
296
+ `DEPLOY.md` for the measurement and retention limits. Hosted source/image
297
+ `18a0bb6a8a0665e91cebc10225fec6f7ebcdaaf7` passed a bounded anonymous smoke on
298
+ 2026-09-13. Hosted verification and npm publication are separate release steps.
299
+
300
+ **Deployment boundaries.** Hosted scheduler admission reasons are private
301
+ scheduler telemetry, not a new SDK or MCP response field. The API's corrected
302
+ comparison probabilities and enriched spread names use the existing response
303
+ shape and reach current clients through fresh API reads. Outcome display names
304
+ may change; use source/event/outcome identifiers for identity, never summed
305
+ prices or matching labels alone. These fixes do not establish trading returns.
306
+
307
+ ## 0.7.8
308
+
309
+ Runner decision-quality, evidence and paper-capital release. Additive: no MCP
310
+ tool was renamed or removed, and the API **contract stays 1.7.0**. This release
311
+ contains all package changes since published 0.7.7 (`gitHead` `80d0cae`), not
312
+ just the previously listed thesis work.
313
+
314
+ **Thesis exits.** Every opening action (`futures_open`, `spot_order`,
315
+ `pm_open`) now carries a `thesis`: a one-sentence summary plus an
316
+ `invalidation` with at least one machine-checkable condition (`priceBelow` /
317
+ `priceAbove` for coins, `probabilityBelow` / `probabilityAbove` for prediction
318
+ markets, a `maxHoldMinutes` time stop, and a free-text `catalyst` the model
319
+ re-judges itself). The runner binds the thesis to the position the server
320
+ returns, sanitized side-aware (a rising price never invalidates a long; a
321
+ wrong-side level is dropped rather than re-signed; the time stop is clamped to
322
+ 60 minutes .. 30 days), persists it in the run state (`RunState.theses`, the
323
+ same state file / `agent_state` JSON as before, no schema change) and
324
+ re-evaluates it every cycle. A futures position whose price level or time stop
325
+ is breached is closed by the runner before the model is asked anything, logged
326
+ as a `thesis_invalidated` exit with its own idempotency key, after the
327
+ kill-switch and drawdown checks and never instead of them. Prediction-market
328
+ positions have no close endpoint, so a broken PM thesis is surfaced to the
329
+ model instead (do not add, let it settle). The parser is tolerant (a malformed
330
+ thesis never fails the open; a thesis copied onto a close is ignored) and the
331
+ structured-output schema requires it, so schema-enforced hosted models always
332
+ emit one.
333
+
334
+ **Fundamentals in the observation.** Each watch entry now carries
335
+ `fundamentals` sourced only from calls the runner already makes: `categories`,
336
+ `marketCapRank` and `marketCapUsd` from the market context; `volume24hUsd` from
337
+ the candles the `indicators` capability already fetches (live-probed
338
+ 2026-09-02: each bar's `v` is a rolling 24h volume, so the latest bar is the
339
+ 24h figure, never the sum); and up to three `headlines` with `publishedAt`
340
+ timestamps from the one `news` call, attributed through the curated coin-news
341
+ graph. Discovered PM markets carry `endDate` and `liquidityUsd`; open PM
342
+ positions carry their title, side, entry and current probability and
343
+ `openedAt`; open futures positions carry `openedAt`. The system prompt states
344
+ the thesis contract, the runner-enforced exit and how to grade a trade on the
345
+ fundamentals. Not carried, because no agent endpoint serves them: an "about"
346
+ text per coin, a 24h probability change and a cross-venue divergence per PM
347
+ market.
348
+
349
+ **Fix:** the public movers feed serializes `change24h` / `currentPrice` as
350
+ decimal strings; the universe-scan context rows read them strictly as numbers
351
+ and shipped `undefined` for every mover.
352
+
353
+ **Opt-in equity-based paper sizing.** A runner can size entries from a
354
+ conservative fraction of its independently attributed paper book instead of a
355
+ fixed stake/margin. The book is accepted only when wallet identity, cash
356
+ partitions, held-position attribution and spot-mark coverage reconcile. Quotes
357
+ then enforce per-entry, per-symbol, deployed-capital and daily-entry limits;
358
+ fee buffers and the API's fee-inclusive quote evidence are included. Any
359
+ missing or inconsistent evidence fails closed. Legacy positions on a different
360
+ book remain visible for management but never inflate the current book's buying
361
+ power.
362
+
363
+ **Prediction-market decisions use executable economics.** PM opens now reject
364
+ an invalid raw probability and a model forecast that does not clear the quoted
365
+ entry price. Forecast edge is measured against the actual fee/slippage-adjusted
366
+ fill, not the headline market probability. Quote-expiry outcomes are recorded
367
+ separately from risk/balance rejection, and futures risk/reward validation uses
368
+ fee-inclusive entry and stop economics.
369
+
370
+ **Decision evidence is structured and bounded.** Cycles can expose a sanitized,
371
+ partial private decision-input record: configuration and observation
372
+ fingerprints, daily budget and guard state, plus bounded observation rows with
373
+ explicit omission counts. It is not a prompt, transcript, raw model output or
374
+ hidden reasoning record. The runner also reports quote/validation evidence for
375
+ abstained, forecast-only and quote-expired PM opportunities. Hosted persistence
376
+ and retention remain the caller's responsibility.
377
+
378
+ **Runtime controls are more faithful.** The model sees the remaining daily
379
+ entry/add budget rather than only static maxima. Entry caps still block new
380
+ risk, while closes and other risk-reducing actions remain available. Direct
381
+ provider HTTP 429 responses are capacity skips rather than model failures, so
382
+ BYO agents do not build a failure streak during ordinary quota pressure.
383
+ Structured-tool decisions remain required where the provider supports that
384
+ contract.
385
+
386
+ **Scorecard fix.** Maximum drawdown now measures decline from starting equity,
387
+ so an immediate loss is no longer hidden by treating the first post-trade point
388
+ as the high-water mark.
389
+
390
+ ## 0.7.7
391
+
392
+ Reliability release. Every change here came from a live production failure, not
393
+ from a roadmap. Additive: no tool renamed or removed, and the API **contract
394
+ stays 1.7.0** because nothing on the documented surface changed.
395
+
396
+ **Model requests are now built from a declared capability table, not
397
+ assumptions.** `providerCapabilities.ts` states, per model family, which
398
+ parameter carries the completion budget, whether a non-default temperature is
399
+ allowed, and what extra body fields the family needs. Two failures this fixes:
400
+
401
+ - **OpenAI's current models rejected our requests outright.** `gpt-5*` and
402
+ `o*` refuse `max_tokens` and any non-default `temperature`; they take
403
+ `max_completion_tokens`. The family is detected by MODEL id, not just the
404
+ provider name, so an OpenAI-compatible gateway serving `gpt-5` gets the same
405
+ shape. If you brought your own OpenAI key, this is why it now works.
406
+ - **NVIDIA Nemotron models emitted a think-chain where the JSON decision
407
+ belonged**, which failed every cycle. The `chat_template_kwargs.enable_thinking=false`
408
+ switch and the "detailed thinking off" system hint are now encoded as data
409
+ rather than re-learned by failing.
410
+
411
+ **New: `probeDecisionContract()`.** An HTTP 200 is not proof a route can run an
412
+ agent. Both production failure modes returned 200s: a think-chain in the JSON
413
+ slot, and an empty completion because a reasoning model spent its whole budget
414
+ before answering. The probe sends a canned mini-observation through the REAL
415
+ decision parser at a >=1024 completion allowance and classifies the result as
416
+ `http`, `empty` or `parse`. Use it before adopting any model id; provider
417
+ catalogs list ids that 404 on invoke.
418
+
419
+ **Provider trouble no longer disables an agent.** A permanent-looking model
420
+ error (404/410/decommissioned) used to disable the agent after a threshold. On
421
+ 2026-08-26 NVIDIA end-of-lifed an entire model line and 35 agents died on that
422
+ path. The runner now reports a hold and keeps retrying each cadence, recovering
423
+ by itself when the provider does. Disables remain for what deserves them:
424
+ revoked credentials, drawdown, kill-switch, user action.
425
+
426
+ **Failures carry structured metadata.** A failed `decide()` now returns
427
+ `status` and, when the provider sends one, `retryAfterMs` (parsed from
428
+ `Retry-After` in both delta-seconds and HTTP-date form, capped at an hour), so
429
+ a caller can tell a 429 from a 5xx without parsing strings. Error text is
430
+ unchanged.
431
+
432
+ **`ClientConfig.extraHeaders`.** Headers attached to every request, spread
433
+ before auth so they can never clobber it. Self-host has nothing to put here;
434
+ it exists so CoinRithm's own hosted scheduler can present its attestation
435
+ channel.
436
+
437
+ **Model names corrected throughout.** The retired Llama 3.x line is gone from
438
+ the README, the runtime defaults and the `quant-reference` example, which is
439
+ relocked onto `nvidia/nemotron-3-nano-30b-a3b`.
440
+
441
+ ## 0.7.6
442
+
443
+ Agent capability release: universe discovery, first-class behavioral guards,
444
+ and the hosted prose budget made visible. Additive — no tool renamed or
445
+ removed. Contract moves to **1.7.0** (two keyless paths declared).
446
+
447
+ **New: agents can look beyond their own watchlist.**
448
+
449
+ - **`get_crypto_movers` tool.** Keyless scan of the tracked coin universe for
450
+ the biggest 24h gainers or losers. Rows carry `coinId`, `symbol`, `name`,
451
+ `slug`, `change24hPct`, `priceUsd`.
452
+ - **`universe_scan` capability** for the self-host runner. Each cycle it pulls
453
+ the top movers, promotes the strongest few into full watch entries marked
454
+ `discovered: true`, and passes the remainder as compact context. Watchlist
455
+ and blocklist symbols are excluded up front, so a discovered row can never
456
+ duplicate a configured pair or bypass the deny list.
457
+ - **Both now carry the coinId through.** The movers row's `ucid` IS the
458
+ `coinId` that `get_candles` / `get_market_context` / the futures quote path
459
+ take. It was previously stripped from the tool response and re-derived from
460
+ the SYMBOL via a resolve round-trip — a wasted call per discovered mover and
461
+ a real correctness hazard, because symbols collide across listings and the
462
+ resolver could return a different coin than the one that actually moved.
463
+
464
+ **New: contract declares the endpoints the tools call.**
465
+
466
+ - `/api/coins/top-gainers` and `/api/coins/top-losers` are now in
467
+ `openapi.yaml` (tag `public-crypto-data`), so both SDKs can reach the
468
+ surface `get_crypto_movers` uses. Probe-verified against prod: bare array,
469
+ no envelope; `change24h` / `currentPrice` are decimal STRINGS; default
470
+ `limit` is 3 and out-of-range values return 400 rather than clamping.
471
+
472
+ **New: personality and boundaries are configurable, and documented.**
473
+
474
+ - **`character/guards.md`** — first-class hard behavioral guards, merged into
475
+ the strategy prose as a distinct section rather than buried in the thesis.
476
+ - **`examples/agents/pia-pump-fader`** — a full bundle demonstrating
477
+ capabilities plus boundary configuration (watchlist/blocklist interaction,
478
+ the five-point risk gate, re-entry discipline).
479
+ - **`examples/agents/FORKING.md`** — a file-by-file map of what is strategy
480
+ and what is plumbing, so a fork knows what it is allowed to change.
481
+ - **QUICKSTART** documents capabilities, and a docs-drift tripwire fails the
482
+ suite when a capability ships undocumented (`universe_scan` shipped
483
+ invisible in every user surface once; that cannot recur silently).
484
+
485
+ **Fixed.**
486
+
487
+ - **Hosted prose budget is validated, not discovered at deploy.**
488
+ `coinrithm-agent validate --hosted` now checks the 8,000-character merged
489
+ prose budget and reports the exact overage. A bundle could previously
490
+ validate clean and still be undeployable. YAML frontmatter is stripped
491
+ before the count (and before the model sees it — it was being fed in as if
492
+ it were strategy). `pia-pump-fader` was rebuilt to fit at 7,932.
493
+ - **Permanent failures stop being revived.** A disabled agent whose model is
494
+ gone or whose key is invalid is no longer resurrected by the scheduler's
495
+ revive pass; only transient failures are retried.
496
+ - **Fresh scaffolds are no longer bricked** by the capabilities field, and
497
+ action-confidence tolerance was widened to match what models actually emit.
498
+ - **False market-data licensing assertion corrected** in both READMEs.
499
+
500
+ ⚠ Publishing to npm remains a **manual** step — `publish-mcp.yml` pushes
501
+ `server.json` to the MCP registry only.
502
+
503
+ ## 0.7.5
504
+
505
+ **Release-hygiene bump. Everything below was already merged but never
506
+ reached npm** — the 0.7.4 tarball was published 2026-07-26T23:01:11Z and
507
+ five commits landed after that instant without a version bump, so the
508
+ repository's 0.7.4 and the published 0.7.4 were different code under one
509
+ version number. This release makes the published artifact match the
510
+ source again.
511
+
512
+ - **Security.** MCP dependency audit fixes, 6 findings to 0 (`da65e9e`).
513
+ Anyone on published 0.7.4 is running the pre-audit dependency set.
514
+ - **`pm_data` Gemini exposure** for agents (`3ab04ae`).
515
+ - **Venue methodology and health** exposed as tools (`74cc495`).
516
+ - **Reproducible decision receipts** persisted by the agent runner
517
+ (`8bebc9e`).
518
+ - **Docs.** Contract version drift corrected and the placeholder SDK
519
+ README replaced, so the docs stop advertising an install that 404s
520
+ (`6d61b92`).
521
+
522
+ No tool was renamed or removed; this is additive plus a dependency
523
+ refresh.
524
+
525
+ ⚠ Publishing this package is a **manual** step — `publish-mcp.yml` only
526
+ pushes `server.json` to the MCP registry, it does not run `npm publish`.
527
+ That asymmetry is exactly how the drift above accumulated unnoticed.
528
+
529
+ ## 0.7.4
530
+
531
+ Docs-only. No tool behavior change, no API-surface change.
532
+
533
+ - **Acceptable Use of Market Data.** The README (root and this package) and
534
+ `openapi.yaml` (`info.termsOfService`, `info.description`, and the
535
+ `public-pm-data` tag) now reference and summarize CoinRithm's licensing
536
+ flow-down restriction on Market Data from third-party prediction-market
537
+ venues: read-only use for paper-trading context and settled-outcome
538
+ scoring only — no model training/fine-tuning/benchmarking, no
539
+ redistribution or bulk-extraction, no use to build a competing product.
540
+ Full terms: <https://www.coinrithm.com/en/terms-of-use>
541
+
542
+ ## 0.7.3
543
+
544
+ Quality-engine surfaces + independent forecasts. Additive; no breaking change.
545
+
546
+ - **Quality verdicts in tool responses.** `discover_pm_markets`, `pm_quote`, and
547
+ the `pm_data_*` tools now surface the persisted truth-engine `quality` object
548
+ (`decisionEligible`, warning/block reason codes, `policyVersion`, `assessedAt`).
549
+ Markets with critical failures stay visible but cannot drive paper opens or
550
+ alerts.
551
+ - **`openBlocked` preview on `pm_quote`.** Quotes preview the open-time quality
552
+ gate (`openBlocked` + `openBlockReasons`), so an agent can skip a market that
553
+ would 422 before burning the open attempt. The self-host runner
554
+ (`coinrithm-agent`) does this skip automatically.
555
+ - **Independent forecasts in the runner.** The self-host agent runner elicits the
556
+ model's OWN probability (judged from the question/resolution criteria/deadline,
557
+ never anchored to the market price) and submits it as `forecastProbability` on
558
+ PM opens — feeding the public calibration dataset with proper-scoring-rule
559
+ forecasts. Clamped to [1,99]; omitted (never faked) when the model does not
560
+ produce one; `HOUSE_AGENT_FORECAST_ENABLED=false` disables.
561
+ - **`crossPlatform` on event lists** documented in the API contract: sibling
562
+ venues pricing the same question, on list rows.
563
+ - **ForecastEx venue truth.** Public MCP discovery copy and registry metadata
564
+ now describe all 11 live venues, including ForecastEx.
565
+ - **Contract synchronization.** Runner templates and example bundles pin the
566
+ served OpenAPI 1.6.0 contract; canonical scorecard paths are unambiguous.
567
+
568
+ ## 0.7.2
569
+
570
+ Docs-truth + privacy release. No tool behavior change, no API-surface change.
571
+
572
+ - **Ten venues in the public listing.** `pm_data_*` tool copy, the README, and
573
+ `server.json` now name all ten venues (adds Futuur and Myriad). npm `0.7.1` was
574
+ published before those landed, so the registry listing still advertised "eight
575
+ venues"; npm versions are immutable, so correcting the public listing required
576
+ a new release.
577
+ - **`source` parameter description** on `pm_data_events` / `pm_data_event_detail`
578
+ now enumerates all ten venue slugs. Accepted values are unchanged — this is
579
+ description text only, which is why it is a patch and not a minor.
580
+ - **Privacy.** Raw model output is no longer persisted, enforcing the package's
581
+ no-chain-of-thought promise.
582
+ - **New tripwire.** `server.json` (the MCP-registry listing) is now guarded
583
+ against version and venue-count drift; it had no guard, which is how it went
584
+ stale in the first place.
585
+ - Refreshed stale Arena-gate example copy.
586
+
587
+ ## 0.7.1
588
+
589
+ Docs + registry-metadata release; no tool behavior changes.
590
+
591
+ - **README refresh**: the keyless `pm_data_*` data surface is now front and
592
+ center — 8 venues (Polymarket, Kalshi, Smarkets, Limitless, Manifold,
593
+ Metaculus, PredictIt, Rothera — the "seven venues" line predated Rothera),
594
+ the anonymous hosted-endpoint path, and the `referenceProbability` /
595
+ `volumeHistory` fields the data tools return.
596
+ - **`server.json`**: hosted endpoint's `Authorization` header marked optional
597
+ (the `pm_data_*` tools work anonymously — verified live) and the server
598
+ description now leads with the keyless data surface.
599
+ - Ships the post-0.7.0 commits: `pm_data_event` advertises `volumeHistory`,
600
+ `pm_data_events` advertises `referenceProbability` on list items, and the
601
+ hosted MCP root (`GET /`) serves a self-describing JSON landing (with a
602
+ 405 + hint on `GET /mcp`).
603
+
604
+ ## 0.7.0
605
+
606
+ (Retroactive entry — released 2026-07-05 without a changelog note.)
607
+
608
+ - **Four keyless `pm_data_*` tools** — CoinRithm's free public cross-venue
609
+ prediction-market dataset over MCP, no API key required and yours is never
610
+ attached: `pm_data_overview` (market-wide stats), `pm_data_events`
611
+ (cross-venue event list), `pm_data_event` (detail incl.
612
+ `crossSourceMatches` + resolution evidence), `pm_data_whales`
613
+ (large-trade tape).
614
+
615
+ ## 0.5.0
616
+
617
+ Agent-runner quality + reliability release. `coinrithm-agent` got materially
618
+ smarter and less noisy; `coinrithm-mcp` is unchanged in shape. Bundles the work
619
+ since 0.4.0.
620
+
621
+ - **Prediction markets are a first-class venue** in the decide prompt: a short
622
+ `pmN` ref so small models trade PM reliably, eligible-outcome filtering (only
623
+ backend-openable outcomes reach the model), and futures-capped agents steered
624
+ to PM (a separate budget) instead of re-rejecting.
625
+ - **PM anti-churn — now actually effective.** The candidate list is pre-filtered
626
+ to exclude markets the agent already holds, and the runner + server both block
627
+ re-betting a held market+outcome (no more one-agent, 25-identical-bets churn).
628
+ An earlier version read the wrong `/positions/pm` fields and was silently dead;
629
+ fixed.
630
+ - **Settlement-feedback learning loop.** The agent sees how its own recent bets
631
+ actually resolved (win/loss/void + realized PnL) as reflective context, so it
632
+ learns from outcomes across cycles.
633
+ - **Per-trade reasoning stays honest about the market.** A multi-action decision
634
+ no longer stamps its primary rationale onto a secondary trade about a different
635
+ market — the trade's public Arena "why" always matches the market it's on.
636
+ - **Futures reliability.** The model is unblinded to per-position mark /
637
+ liquidation / stop / take-profit prices; take-profit is auto-clamped to a valid
638
+ R:R target off the stop (kills the `take_profit_not_*_mark` reject waves); and a
639
+ marking-down PM book now trips the equity-drawdown kill-switch too.
640
+ - **News capability.** Recent high-importance news for the watchlist coins is fed
641
+ into the decide context as a market-catalyst layer.
642
+ - **Robustness + contract accuracy.** Scheduler/runner hardening, flat-state
643
+ prompt steers (weak models stop hallucinating closes), manage-enum
644
+ normalization, and the PM contract now documents real entry friction rather
645
+ than a disclose-only stance.
646
+ - **Security.** `hono` bumped to 4.12.27 (high-severity advisories: serve-static
647
+ path traversal, CORS wildcard-with-credentials, body-limit bypass).
648
+ - **Docs.** The npm README leads with value / free / OKF / Studio; stale
649
+ scheduler and `minDecidedTrades` claims corrected.
650
+
651
+ ## 0.4.0
652
+
653
+ - **Deterministic scorecard engine (`computeScorecard`).** The reproducible-
654
+ evaluation engine for `coinrithm.agent.scorecard.v1` — pure math over an
655
+ agent's realized track record (no network, no model): realized PnL, win rate,
656
+ expectancy, profit factor, reward-to-risk, Sharpe, Sortino, deflated /
657
+ probabilistic Sharpe (Bailey & López de Prado — skill vs luck with a multiple-
658
+ testing penalty), max drawdown, and Brier + ECE calibration for probabilistic
659
+ calls. Same inputs → identical metrics **and** a sha256 `contentHash` of the
660
+ canonicalized result, so a scorecard whose hash doesn't reproduce isn't
661
+ trusted. Metrics are computed AFTER the run from immutable evidence (leakage-
662
+ separation), so tuning-to-the-metric is structurally impossible. Returns
663
+ `null` for thin records — never a fabricated number.
664
+ - **Resolver: committable file metadata + functionality pin.** The OKF resolver
665
+ now carries per-file metadata and pins functionality through resolution, so a
666
+ bundle's behavior is reproducible from its committed files.
667
+
668
+ ## 0.3.0
669
+
670
+ - **Agent risk config: coin deny-list (`blocklist`).** `risk.blocklist` lets an
671
+ agent name symbols it must never open, even if they are on the watchlist —
672
+ deny wins over allow. Enforced in the runner's decision validator (rejects
673
+ `futures_open` / `spot_order` on a denied symbol) and surfaced in the system
674
+ prompt, so the model is told the boundary and the runner re-checks it.
675
+ - **Docs: Open Knowledge Format positioning.** Clarified that a CoinRithm agent
676
+ is an OKF bundle — a portable directory of markdown + frontmatter that is
677
+ model-agnostic (run the same definition on any model). Develop and prove it
678
+ free on paper, then run it anywhere.
679
+ - npm keywords refreshed (`open-knowledge-format`, `okf`, `model-agnostic`,
680
+ `gemini`) for registry discovery.
681
+
682
+ ## 0.2.0
683
+
684
+ - Added the **`coinrithm-agent`** self-host runner binary alongside the MCP
685
+ server: a folder-as-architecture (OKF) agent you bring your own model key to,
686
+ with caps enforced by the runner (not the model), dry-run by default,
687
+ paper-only.
688
+
689
+ ## 0.1.x
690
+
691
+ - Initial `coinrithm-mcp` MCP server: reads, quotes, scoped spot/futures/PM
692
+ writes, ledger export, and Agent Arena integration over a user-minted API key.