Repository navigation
Releases
v0.4.4 — user recipes + perception status
[0.4.4] — 2026-05-14
Summary
v0.4.4 makes hermes-quant meaningfully customizable for non-contributors: PDR recipes can now be authored as YAML under ~/.hermes/quant/recipes/, perception freshness can be checked per recipe, and the committee runner exposes a safe model-mixture prompt surface without adding hidden model calls to trading ticks.
Added
- ADR-0025: user-editable recipes and perception status.
- User recipe YAML loader: built-ins plus
~/.hermes/quant/recipes/*.yamlare loaded by the recipe registry. hermes quant recipes list|validate|example: list all recipes, validate a recipe YAML, or write/print a starter template.hermes quant perception status: report fresh/stale/missing/future semantic packets for every symbol in a recipe using its configuredhermes_semantic.max_age_minutes.hermes quant committee prompt: emit a self-contained Hermes prompt for a future multi-model committee job, including packet hashes and required roles.
Changed
- User recipes cannot shadow built-in recipe IDs; this prevents accidental override of known templates.
- Recipe listing now includes user recipes by default, while preserving deterministic ordering.
- README quickstart now shows recipe customization and perception status commands.
Safety posture
- Recipe validation keeps live autonomous recipes rejected until live-reactor gates are explicitly implemented.
- Perception status is read-only.
- The model-mixture surface is prompt/artifact-driven; no trading tick performs hidden model calls.
Test sweep
- 604 passed, 1 skipped (was 599 → +5, zero regressions).
v0.4.3 — perception artifacts + autonomous semantic cron
[0.4.3] — 2026-05-14
Summary
v0.4.3 makes the semantic/deliberative PDR layer usable by normal Hermes plugin operators: semantic packets and committee turns are now filesystem artifacts with CLI write/validate/list/run surfaces, autonomous semantic perception can be installed as a Hermes cron job, and advisor/backtest/signal artifacts persist semantic provenance hashes.
Added
- ADR-0024: autonomous semantic perception as an artifact pipeline rather than live model calls in trading ticks.
hermes_quant.artifacts: atomic JSON stores for semantic packets and committee-turn artifacts under~/.hermes/quant/.hermes quant semantic-packet write|validate|listfor operator-authored or Hermes-authored semantic perception artifacts.hermes quant committee run|listfor deterministic committee-turn artifacts derived from semantic packet archives.hermes quant perception startto create/dry-run a Hermes cron job that autonomously researches sources and writes semantic packets.- Backtest artifact injection flags:
--semantic-packet-fileand--committee-turns-fileforhermes quant backtest. - Advisor CLI artifact injection flags for
hermes quant recommend. - Dogfood audit:
docs/audits/2026-05-14-v043-btc-usdt-dogfood.mdcomparing MVP vs deliberative recipes.
Changed
- Backtest replay now instantiates the recipe-selected aggregator for learning loops instead of always forcing BMA; this preserves the deliberative recipe during replay.
- Backtest decision snapshots now record recipe metadata, semantic packet hashes, committee decision metadata, and aggregator name.
- Daemon signal records now include component metadata, signal metadata, semantic packet hashes, and committee-turn hashes for downstream attribution.
- README and plugin manifest now reflect the current install/customization surfaces.
Dogfood summary
7-day BTC/USDT Kraken smoke, 1h bars, warmup 24:
| variant | decisions | fires | return | buy_hold | excess |
|---|---|---|---|---|---|
btc-usdt-mvp |
1 | 2 | -0.07% | +0.12% | -0.19% |
btc-usdt-deliberative no packets |
0 | 0 | +0.00% | +0.12% | -0.12% |
btc-usdt-deliberative curated packet |
0 | 0 | +0.00% | +0.12% | -0.12% |
Interpretation: this is a smoke test, not a promotion gate. The deliberative path currently fails closed under insufficient semantic coverage, which is the desired safety behavior. Next dogfood needs autonomous packet coverage across the full window.
Test sweep
- 599 passed, 1 skipped (was 593 → +6, zero regressions).
v0.4.2 — semantic perception + deliberative committee
[0.4.2] — 2026-05-14
Summary
v0.4.2 makes Hermes itself part of the PDR trading architecture: semantic analysis can enter the Perceive layer as replayable packets, and the Decide layer now has a TradingAgents-style deliberative committee scaffold for bull/bear/risk/portfolio-manager collaboration.
Added
- ADR-0022: Hermes semantic perception layer. Semantic packets are precomputed Hermes/model/human research artifacts consumed by analysts; no hidden model/web calls happen inside a trading tick.
- ADR-0023: Deliberative committee decision layer. The committee records research debate, trader synthesis, risk debate, and portfolio-manager synthesis while preserving the
Aggregatorprotocol. hermes_quant.semantic:SemanticPacket, source provenance, canonical packet hashing, parsing, and validation helpers.HermesSemanticAnalyst(hermes_quant.analysts.semantic): consumes semantic packets fromMarketContext.extras, emits normalAnalystViews, and abstains with zero confidence when packets are missing/stale/future/tampered.DeliberativeCommitteeAggregator(hermes_quant.aggregators.deliberative): deterministic TradingAgents-style committee scaffold with bull/bear/neutral research turns, trader synthesis, aggressive/conservative/neutral risk perspectives, and portfolio-manager metadata.btc-usdt-deliberativerecipe: BTC/USDT recipe using quantitative analysts +hermes_semantic+deliberative_committee, paper/backtest-only.quant_recommendschema/tool path accepts optionalsemantic_packetsandcommittee_turnsartifacts for replayable semantic/model-mixture inputs.
Changed
advisor.recommend()acceptsmarket_extrasso replay/tool callers can inject semantic packets and committee turns without changing the analyst protocol.- Advisor aggregated-signal JSON now carries
metadata, exposing committee deliberation traces to Hermes/tool callers. - Architecture docs now document semantic packets and model-mixture deliberation as first-class PDR extension seams.
Safety posture
- Model-backed debate is artifact-driven, not live-call-driven: future Hermes model mixtures should write explicit
committee_turnswith model IDs/input hashes before aggregation. - Deliberation can reduce confidence or force flat on disagreement; it cannot bypass the deterministic risk gate.
- Semantic packets are hash-verified and freshness-checked; invalid packets produce abstain views, not trades.
Test sweep
- 593 passed, 1 skipped (was 580 → +13, zero regressions).
v0.4.1 — Hermes-native PDR recipes
[0.4.1] — 2026-05-14
Summary
v0.4.1 turns hermes-quant from a hard-coded MVP committee into a Hermes-native PDR recipe platform. A recipe is now the named, inspectable, replayable unit of a trading system: it declares Perceive components (provider + analysts), Decide components (aggregator + risk gate), React policy (paper/live mode constraints), and evaluation gates.
Added
- ADR-0021: PDR recipes as the runtime contract above component entry-points.
hermes_quant.recipes.PDRRecipewith stable config hashing, validation, built-inbtc-usdt-mvprecipe, and component instantiation helpers.quant_recipesHermes tool and/quant recipesslash path for read-only recipe discovery.- Advisor recipe metadata:
quant_recommend/advisor.recommendacceptrecipe_idand return{id, config_hash}in result JSON. - Backtest recipe passthrough:
replay()andwalk_forward_replay()forwardrecipe_idinto the production advisor path. - Architecture documentation:
docs/architecture/pdr-trading-system.mdplus architecture index. - ADR index:
docs/adr/README.mdgenerated for the full ADR set.
Fixed / Changed
- The advisor no longer has to be the only place where the canonical analyst loadout is encoded; default behavior remains compatible, but recipes are now the extensibility seam.
quant_recommendno longer forcesasset_class="equity"when a recipe should supply crypto/equity defaults.
Test sweep
- 580 passed, 1 skipped (was 572 → +8, zero regressions).
v0.4.0 — charter MVP loop: replay settlements, walk-forward, cache
[0.4.0] — 2026-05-14
Summary
v0.4.0 closes the charter MVP loop from data → replay → empirical decision:
- the BMA aggregator now learns from replay settlements (
EpisodeOutcome)
during backtests; quant_doctorsurfaces analyst confidence drift from the signal bus;- purged walk-forward replay composes ADR-0019 cross-validation with the
production ADR-0020 replay harness; - OHLCV provider fetches are cached on disk so repeated BTC/USDT dogfood runs
are deterministic and cheap; - the first real BTC/USDT ccxt smoke is documented.
Charter decision from the real-data smoke: do not proceed to RL aggregator
or live reactors yet. A 30-day Kraken BTC/USDT contiguous replay failed
buy-and-hold by -6.56%; 3-fold walk-forward was slightly positive but only
emitted two decisions, which is not enough evidence.
Added
- Backtest calibrator loop (V03-5) —
replay()now uses a long-lived
aggregator across bars and settles pending decisions intoEpisodeOutcome
updates aftersettlement_horizon_bars.BacktestResultexposes
n_settlementsand finalaggregator_posteriors; markdown reports include
a per-analyst BMA posterior table. - Doctor drift surface (V03-6) —
quant_doctorreports per-analyst
lifetime vs recent-window confidence drift, flags vanished analysts, and
tolerates malformed signal-bus records. - Purged walk-forward backtest (Wave I) —
hermes_quant.backtest.walk_forward_replay()runs independent
out-of-sample replay folds and aggregates mean excess return, Sharpe delta,
positive-excess fold rate, total decisions, and settlements. - CLI walk-forward mode —
hermes quant backtest --walk-forward --n-splits N
writes per-fold equity/decision artifacts plus an aggregateresult.json. - OHLCV file cache (V03-7) —
hermes_quant.data.cache.OhlcvCachestores
provider/symbol/timeframe bars under~/.hermes/quant/cache/<provider>/,
with append/dedupe/sort and atomic writes. Parquet preferred, CSV fallback. - Provider-selectable CLI fetch —
--provider ccxt:kraken/
ccxt:coinbase/yfinance, plus--cache-rootand--no-cache. - Real-data audit —
docs/audits/2026-05-14-btc-usdt-realdata-smoke.md
records Binance geoblock evidence, Kraken fetch details, single-run and
walk-forward results, and the charter decision.
Fixed
_read_jsonl_tail()no longer drops the first JSONL record when the whole
file fits in the read window.- Backtest CLI provider lookback buffer reduced so caches don't miss forever
when exchanges return slightly fewer closed bars than requested. quant_doctoruses live module-attribute lookup for path globals to avoid
stale__globals__under pytest import-order/module-dict duplication.
Test sweep
- 572 passed, 1 skipped (was 530 → +42, zero regressions).
Quick start
# Fetch via Kraken ccxt with cache and run walk-forward replay
hermes quant backtest --symbol BTC/USDT --asset-class crypto \
--timeframe 1h --provider ccxt:kraken \
--start 2026-04-14T00:00:00Z --end 2026-05-14T00:00:00Z \
--walk-forward --n-splits 3 \
--output-dir ~/.hermes/quant/backtests/btc-kraken-wf/v0.3.2 -- Backtest harness: charter empirical gate
v0.3.2 -- Backtest harness: the charter's empirical gate
The release the charter has been waiting for.
Charter: "if your three-analyst committee on BTC can't beat buy-and-hold
risk-adjusted on paper, more analysts won't fix it."
Until now that question required 4-8 weeks of wall-clock paper trading
to answer. v0.3.2 makes it computable in seconds via historical replay
through the production advisor pipeline.
hermes quant backtest --symbol BTC/USDT --asset-class crypto
--timeframe 1h --bars-file ~/.hermes/quant/cache/btc-1h.csv
Output: report.md + result.json + equity_curve.csv + decisions.jsonl
in ~/.hermes/quant/backtests//.
The line that matters: "Excess return vs buy-and-hold: +X.XX%"
Highlights
- ADR-0020: REPLAY (not simulation). Uses production advisor pipeline
verbatim. Charter Reproducibility honored: same bars + same config_hash
-> same equity curve, byte-identical. - backtest.replay() walks bars chronologically through advisor.recommend()
with lookahead-safe as_of cutoff at every bar. - PaperPortfolio: minimal mark-to-market book with slippage, commission,
lot-matching realized P&L, position flips. - Buy-and-hold baseline + Sharpe + Deflated Sharpe (PSR for n_trials=1)
- max drawdown computed inside replay().
- BacktestResult.excess_return_vs_buy_hold_pct is THE charter-gating
headline. Negative over multi-month backtest = "fix analysts before
RL aggregator work" per charter.
Tests: 530 passed, 1 skipped (was 506 -> +24, zero regressions).
What this unblocks
v0.4+ RL aggregator work was charter-gated on "paper-trade for 4-8
weeks first." With replay, operators can now answer:
- Does the three-analyst committee beat buy-and-hold on BTC/USDT 1h
over 2024? Run a backtest. (Seconds.) - What's the Deflated Sharpe accounting for backtest-overfitting? In
the report. - What's the per-bar equity curve? equity_curve.csv ready to plot.
The charter's empirical gate is now computable. v0.4's RL work can
proceed iff the v0.3.x committee actually beats buy-and-hold on
real data -- which is exactly what the charter requires.
v0.3.1 -- Phase-7 review fixes
v0.3.1 -- Phase-7 review fixes (intersection P0s)
Three-way Phase-7 review of v0.3.0 (correctness + test-quality +
architecture lenses) caught five issues single-author construction
had missed. The loud one: the CHANGELOG claim "ALL THREE analysts
shipped" was structurally FALSE -- the advisor hard-coded two analysts
and never instantiated KronosAnalyst for live ticks. v0.3.1 closes that
plus the BMA abstain-filter contract from ADR-0018 D4.
Highlights
- BMA abstain filter wired (ADR-0018 D4): views with confidence < 0.10
dropped before aggregation. Closes the bug where Kronos's zero-confidence
abstain (on missing kronos package) inflated silence-bias gate
voice-count. - Advisor loads KronosAnalyst as third voice -- the charter MVP recipe
now actually delivered for live ticks. - KairosAnalyst phantom entry-point removed (would have broken plug-and-
play install discovery). - Lookahead CI gate rewired to canonical evaluation.lookahead module
(Wave-D follow-up v0.3.0 didn't complete). - KronosConfig deterministic_seed=42 for charter "every signal replayable
from disk" invariant.
Test sweep: 506 passed, 1 skipped (was 494 -> +12, zero regressions).
Phase-7 review artifacts on disk at docs/reviews/2026-05-13-v030/:
correctness.md + test-quality.md + architecture.md. 16 P1/P2 items
explicitly deferred to v0.3.2+ (CHANGELOG enumerates).
v0.3.0 -- MVP charter recipe: three-analyst BTC/USDT committee
v0.3.0 -- MVP charter recipe: three-analyst BTC/USDT committee shipped
The founding charter's MVP recipe lands. The two modules that gated
"three-analyst committee on liquid crypto, paper-trade 4-8 weeks
before any RL aggregator work" are now wired:
- CcxtProvider for crypto OHLCV (Binance default, multi-exchange).
- KronosAnalyst as the third BMA voice (lazy-load, distributional
via subclass, [0.30, 0.85] overconfidence clip).
Plus the evaluation/ module promotion (PurgedWalkForward, lookahead
test, Deflated Sharpe Ratio) for v0.4 RL hooks, and the autonomous-
tick cron writer is actually wired now (was print-only in v0.2).
Highlights
- ADR-0017: lookahead-safe leaf filter for ccxt (bar OPEN time semantics
per ccxt issue #21783 -- admit only bars where open_ts + tf_seconds
is at-or-before as_of). - ADR-0018: KronosAnalyst as ONE voice in the BMA committee, not the
oracle. Path-agreement confidence with hard clip mitigates the
Kairos A-shares neg-IC failure mode the charter warns about. - ADR-0019: evaluation/ scaffolding for v0.4 RL training (cv.py +
lookahead.py + dsr.py).
Charter status post-v0.3
| Charter clause | Status |
|---|---|
| MVP -- three-analyst BTC/USDT committee | SHIPPED (TA + Microstructure + Kronos) |
| Walk-forward CV + lookahead + DSR | SCAFFOLDED |
| Money-software discipline | HONORED at leaf + analyst layers |
| AAAI 2026 acceptance != alpha | Clip + abstain-on-failure + zero RL training |
Tests: 494 passed, 1 skipped (was 426 -> +68, zero regressions across
4 waves). Optional-extras pyproject cleanup. 16 ADRs total.
Quick start
pip install 'hermes-quant[ccxt]' # for crypto bars
pip install 'hermes-quant[kronos]' # for Kronos forecaster
hermes quant autonomous start --cadence 15m \
--watchlist BTC/USDT:crypto:1h
# cron job is now created automatically
Deferred to v0.4+
- Paper-trade BTC/USDT for 4-8 weeks (the charter's empirical gate)
- News-LLM analyst per ADR-0012
- Options analyst + Greeks-aware sizer
- Live reactors gated by ADR-0016 section D6 three-lock
- RL aggregator (charter explicitly defers until paper-trade Sharpe
is measured)
Per the charter: "if your three-analyst committee on BTC can't beat
buy-and-hold risk-adjusted on paper, more analysts won't fix it."
v0.3 is the recipe; v0.4 is the empirical answer.
v0.2.0 -- Autonomous mode (silence-bias-gated paper trading)
v0.2.0 -- Autonomous mode (silence-bias-gated paper trading)
THIRD PDR SURFACE: Hermes watches the watchlist on a cadence and
fires paper trades automatically when the 4-dim silence-bias gate
agrees. Per the founding charter, silence is the DEFAULT -- the gate
is rewarded for correct inaction.
Highlights
- ADR-0016 -- autonomous mode contract codifying charter principles
- 4-dim silence-bias gate: confidence x urgency x voices x salience;
ALL FOUR must pass for FIRE - Config-driven watchlist with flock + atomic-rename safety
- tick() orchestrator: mode-gated, kill-switch-gated, per-symbol
error isolation, structured operator-readable output - 5 new tools (15 total): quant_autonomous_tick (dry-run default),
quant_autonomous_status, quant_watchlist_add/remove/list - CLI: hermes quant autonomous {tick, status, start, stop, reset,
watchlist {list, add, remove}} - Slash: /quant auto tick|status, /quant watchlist list|add|remove
Safety rails
- Tool surface defaults to dry_run=True. LLM agents cannot fire
trades through tool calls -- only cron with --no-dry-run does. - Mode gate read on every call -- flip without restart.
- max_per_tick_opens caps new positions per tick (default 1).
- Kill switch (default -10% cumulative paper P&L) auto-disables
autonomous; reset requires hermes quant autonomous reset --confirm. - Paper-only in v0.2. Live deferred to v0.3 behind three locks.
Tests: 426 passed, 1 skipped (was 365 -> +61, zero regressions).
Quick start
hermes quant autonomous start --cadence 15m \
--watchlist BTC/USDT:crypto:1h,ETH/USDT:crypto:1h,AAPL:equity:1d
hermes quant autonomous status
hermes quant autonomous tick # safe dry-run
hermes quant autonomous tick --no-dry-run # real paper trade if FIRE
Then wire the cron tick (printed by start):
hermes cron create "15m" \
--script "$(which hermes) quant autonomous tick --no-dry-run --json" \
--no-agent
Operators see every tick output (FIRE / SILENCE_* / ERROR) delivered
to their configured cron destination -- nothing fires silently.
Files: docs/adr/ADR-0016-autonomous-mode.md, hermes_quant/gates/,
hermes_quant/watchlist.py, hermes_quant/autonomous.py.
Architecture: ADR-0013 (no monkeypatches), ADR-0014 (advisor reused),
ADR-0015 (PaperReactor reused), ADR-0010 (settlement journal feedback).
v0.1.2 — PDR (Perceive-Decide-React) plugin
v0.1.2 — PDR (Perceive-Decide-React) plugin
Reframes hermes-quant as a three-mode PDR plugin: advise (chat-mode
guidance), hitl (propose-approve-react with paper trading), autonomous
(deferred to v0.2). Same Analyst -> BMAAggregator -> DefaultRiskGate
pipeline drives all three.
KEY ADDITIONS:
- HITL React layer (ADR-0015): quant_propose, quant_approve, quant_reject,
quant_pending, quant_proposal tools + PaperReactor + JSONL+SQLite
proposal store with lazy TTL expiration - Settlement journal (ADR-0010): markdown ledger, Pydantic-only writer,
two-phase pending->resolved, atomic-rename, get_recent_lessons (no
embeddings — explicit divergence from TradingAgents' removed
FinancialSituationMemory) - MicrostructureLite analyst — second voice for BMA (Bollinger %B +
trend quality + order-flow toxicity proxy) - Lookahead enforcement at the leaf data layer (
as_ofparam on
DataProvider, leaf-level filter, test_no_lookahead.py CI gate) - Path-safety guard (safe_symbol_component) for user-supplied tickers
- Monotonic-clock heartbeat (wall-clock jump-backward no longer extends
grace window; Phase-8 P1-ε) - Decision price exposed as top-level advisor field
NEW DOCS:
- Founding charter saved verbatim to docs/charter/
- 3 new ADRs: 0013 (integration stance), 0014 (advisor surface),
0015 (HITL React) - Architecture review docs/reviews/2026-05-13-v0.1.2-architecture/
TEST COUNT: 273 (v0.1.1) -> 365 (v0.1.2). +92 tests covering HITL e2e,
journal, microstructure, no-lookahead invariant, monotonic heartbeat,
symbol safety, advisor contract. Zero regressions.
THE PDR LOOP CLOSES: HITL approve -> paper React (executions.jsonl)
-> journal entry -> next quant_recommend reads journal -> operator
sees prior decisions inline with new recommendations. Calibrator
update on rejections is config-gated and ready (consumer gates lift
when portfolio_loader rewrite lands).
DEFERRED TO v0.2:
- autonomous mode with silence-bias gate
- live broker reactors (alpaca, ccxt) gated by --live + creds
- Discord button-based UI
- KronosAnalyst, KairosAnalyst (deterministic neural)
- ccxt provider for crypto (advisor returns gated asset_class_unsupported
until then) - portfolio_loader rewrite (ADR-0011) -> calibrator gate lift
- OHLCV file cache, trading_calendars for halt_until,
halt-mirror staleness fallback