A manifest.yaml is the single source of truth for a strategy asset: identity
(family@version), market/symbol/timeframe, engine/ABI, parameter schema, data requirements,
signal contract, risk constraints and admission state. The same manifest drives Athena backtests and
hermes/signal live signal generation, so backtest and live never drift.
$id: https://bitvalue.io/schema/strategy-manifest/v1). Validate a manifest with any
JSON-Schema validator after parsing the YAML to JSON.
Each strategy version is a directory; the manifest has a fixed name:
strategies/assets/<family>/<version>/manifest.yaml
family and version come from the manifest itself and must match the directory
(a validation check). The locator is family@version (e.g. eth15m@2026q3).
schema_version: "1.0" # 1) identity name: eth-15m-psar family: eth15m version: "2026q3" # 2) market market: crypto symbol: ETH-USDT-SWAP timeframe: 15m exchanges: [OKX] # 3) engine engine: kind: bsl # go | bsl | so | python entrypoint: strategy.js # required when kind=bsl language: js # 4) parameters parameters: - { name: atr_length, type: int, default: 14, min: 1, max: 500, tunable: true } - { name: er_threshold, type: float, default: 45.0, min: 0, max: 100, step: 0.1, tunable: true } # 6) data requirements data_requirements: input_types: [OHLCV] lookback_bars: 300 warmup_minutes: 4500 # = lookback_bars × timeframe # 7) signal contract signal_output: actions: [ENTER_LONG, CLOSE_LONG, FLIP_TO_LONG] emits_desired_orders: true # 8) risk constraints (AGENTS §9 hard-checks) risk: sl_protection_mode: enforced # enforced | strategy_managed has_protective_sl: true reduce_only_close: true # must be true flip_two_phase: true # required if strategy emits FLIP # 9) admission (governance) admission: state: backtest_passed paper_allowed: true live_allowed: false
| Block | Required fields | Purpose |
|---|---|---|
| identity | schema_version, name, family, version | family@version locator |
| market | market, symbol, timeframe | research/live target |
| engine | engine.kind (so|go|python|bsl) | engine + ABI; entrypoint required when kind=bsl |
| parameters | each: name, type, default | type ∈ int|float|bool|enum; enum needs options[] |
| data_requirements | input_types, lookback_bars | warmup; warmup_minutes should = lookback_bars × timeframe |
| signal_output | actions (advisory) | cross-checked against the execution layer |
| risk | reduce_only_close, has_protective_sl | admission hard-checks (AGENTS §9) |
| admission | state, paper_allowed, live_allowed | governance; default live_allowed: false |
| provenance | — | lineage/audit (source commit, Pine source, reviews) |
Beyond the structural schema, athena strategy validate enforces:
family/version must match the asset directory name.engine.kind=bsl ⇒ engine.entrypoint set and the file exists.risk.reduce_only_close must be true.admission.live_allowed=true ⇒ risk.has_protective_sl=true or
risk.sl_protection_mode=strategy_managed, and admission.reviewer set.FLIP actions ⇒ risk.flip_two_phase=true.warmup_minutes should equal lookback_bars × timeframe (warn otherwise).draft → pine_mapped → engine_implemented → golden_aligned → backtest_passed → walkforward_passed → health_check_passed → paper_approved → live_small_cap_approved → live_scaled → deprecated