Kairos staged trader — backtest report   gemma4:31b-cloud

Variant comparison across BTC + WETH on identical window.

window: 2026-02-01T00:00:00Z → 2026-02-16T00:00:00Z tick: 1h initial vault: $10,000 model: gemma4:31b-cloud generated: 2026-05-07 05:14:53 UTC

Variant ranking — aggregate across asset

#VariantTradesΣ PnL ($)Avg PnL %Distribution
1 full-counter-trend 6 +$58.94 +0.29%
2 full-plus-sizing 25 $-17.16 -0.09%
3 no-bear-pathB 12 $-91.66 -0.46%
4 base 30 $-927.93 -4.64%

Per-asset breakdown

VariantPairTradesFinal $PnL ($)PnL %
base btcusdc 10 $9835.57 $-164.43 -1.64%
base wethusdc 20 $9236.50 $-763.50 -7.63%
full-counter-trend btcusdc 4 $10146.83 +$146.83 +1.47%
full-counter-trend wethusdc 2 $9912.11 $-87.89 -0.88%
full-plus-sizing btcusdc 6 $10086.17 +$86.17 +0.86%
full-plus-sizing wethusdc 19 $9896.67 $-103.33 -1.03%
no-bear-pathB btcusdc 6 $10086.17 +$86.17 +0.86%
no-bear-pathB wethusdc 6 $9822.17 $-177.83 -1.78%

Findings

Prompt variants — what each one changes vs base

For each non-base variant, the diff vs the production prompt (collapsed context). Click to expand the full text.

full-counter-trend overrides 1 stage: 02-decide
02-decide.md  diff vs base
You are the **decide** stage of the trading workflow.
… 16 unchanged lines …
Test exits in priority order. First match wins.
+ **Min-hold protection (counter-trend):** When `previous.open_position_entry_path ∈ {"B", "E"}` AND `previous.open_position_ticks_since_buy < 2`, the only exits allowed are `stop` (safety) and `tp` (full take-profit). Skip `scalp`, `trailing`, and `reversal` — counter-trend entries need at least 2 tick bars to let the rebound develop. If neither stop nor tp fires within this window → `hold`.
+
**Stop-loss:** `previous.price <= previous.open_position_stop_loss_usd` → `sell`, `path: "stop"`, full close.
… 4 unchanged lines …
**Trailing exit:** the orchestrator does not have a way to compute "NET PnL" without arithmetic, so this path requires `previous.tf_15m` flipping to `SELL` AND `previous.macd_15m_histogram < 0` AND `previous.price > previous.open_position_cost_basis_usd / previous.vault_position_token_amount`. (The position is up vs cost basis AND momentum is rolling over.) → `sell`, `path: "trailing"`.
- **Trend reversal:** `previous.tf_4h ∈ {SELL, STRONG_SELL}` AND `previous.tf_daily ∈ {SELL, STRONG_SELL}` → `sell`, `path: "reversal"`.
+ **Trend reversal:** `previous.tf_4h ∈ {SELL, STRONG_SELL}` AND `previous.tf_daily ∈ {SELL, STRONG_SELL}` AND `previous.open_position_entry_path ∉ {"B", "E"}` → `sell`, `path: "reversal"`. **Excluded for B/E entries**: those paths enter deliberately counter-trend, so a still-bearish HTF is the entry premise, not a reversal — let stop/tp/scalp/trailing handle the exit.
If none fire → `hold`.
… 42 unchanged lines …
- `previous.tf_4h ∈ {BUY, STRONG_BUY, NEUTRAL}` (4h reversing up)
- `previous.tf_1h ∈ {BUY, STRONG_BUY}` AND `previous.rsi_15m >= 50`
+ - `previous.macd_15m_flipped_positive == true` (15m momentum confirms — required to avoid catching a falling knife)
Size: 65% aggressive / 50% moderate / 30% conservative.
… 29 unchanged lines …
show full prompt (variant)
You are the **decide** stage of the trading workflow.

Apply the strict v30 rules to research's output and pick exactly one action. **NO arithmetic.** Compare values directly with the listed thresholds. Do not derive flags, do not recompute MACD/RSI/EMA, do not interpolate.

## Previous stage output

```json
{{previous}}
```

## Decision rules

**Default = HOLD.** Only emit `buy` / `sell` when an explicit rule fires below.

Risk thresholds come from `strategy.config` in the system prompt: `entryRsiThreshold`, `fullAlignmentBars`, `spotEntryPct`, `maxExposurePct`, `scalpRsiThreshold`. Defaults below assume the aggressive tier; moderate / conservative override via the config knobs.

### Position-already-open path (`previous.vault_position_token_amount > 0`)

Test exits in priority order. First match wins.

**Min-hold protection (counter-trend):** When `previous.open_position_entry_path ∈ {"B", "E"}` AND `previous.open_position_ticks_since_buy < 2`, the only exits allowed are `stop` (safety) and `tp` (full take-profit). Skip `scalp`, `trailing`, and `reversal` — counter-trend entries need at least 2 tick bars to let the rebound develop. If neither stop nor tp fires within this window → `hold`.

**Stop-loss:** `previous.price <= previous.open_position_stop_loss_usd` → `sell`, `path: "stop"`, full close.

**Full take-profit:** `previous.price >= previous.open_position_tp_target_usd` → `sell`, `path: "tp"`, full close.

**Quick scalp (33%):** `previous.price >= previous.open_position_scalp_target_usd` AND (`previous.rsi_1h >= scalpRsiThreshold` OR `previous.rsi_15m >= scalpRsiThreshold + 5`) → `sell`, `path: "scalp"`, `scalp_pct: 33`.

**Trailing exit:** the orchestrator does not have a way to compute "NET PnL" without arithmetic, so this path requires `previous.tf_15m` flipping to `SELL` AND `previous.macd_15m_histogram < 0` AND `previous.price > previous.open_position_cost_basis_usd / previous.vault_position_token_amount`. (The position is up vs cost basis AND momentum is rolling over.) → `sell`, `path: "trailing"`.

**Trend reversal:** `previous.tf_4h ∈ {SELL, STRONG_SELL}` AND `previous.tf_daily ∈ {SELL, STRONG_SELL}` AND `previous.open_position_entry_path ∉ {"B", "E"}` → `sell`, `path: "reversal"`. **Excluded for B/E entries**: those paths enter deliberately counter-trend, so a still-bearish HTF is the entry premise, not a reversal — let stop/tp/scalp/trailing handle the exit.

If none fire → `hold`.

### No-position path (`previous.vault_position_token_amount == 0`)

**HARD GUARD — read before everything else in this section.** When `previous.vault_position_token_amount == 0` you hold zero of the trading token, so you have NOTHING to sell. Exits (`stop`, `tp`, `scalp`, `trailing`, `reversal`) are FORBIDDEN here regardless of how bearish the timeframes look — they exist ONLY in the Position-already-open path above. The only valid emissions when position is 0 are: `hold`, or `buy` with one of the entry paths A / B / C / D / E. Emitting `{"decision":"sell", ...}` with `vault_position_token_amount == 0` is a hard contract violation: there is no inventory to dispose of and the orchestrator will reject it.

Test in priority order. First match wins. Use `config.entryRsiThreshold` (default 45 aggressive / 42 moderate / 40 conservative) where shown.

#### Path A — Short-timeframe mean-reversion

LONG fires when ALL hold:
- `previous.rsi_1h < config.entryRsiThreshold`
- `previous.rsi_15m_crossed_up_from_below_35 == true` (15m oversold reversal confirmed)
- `previous.macd_15m_flipped_positive == true` (15m momentum flipped within the last 2 bars)
- `previous.tf_daily ∉ {SELL, STRONG_SELL}` (1d not bearish — daily-flat-or-better)

Size: `config.spotEntryPct.A` (default 50% aggressive / 35% moderate / 20% conservative).

#### Path E — Capitulation oversold (BYPASS HTF wall, SPOT-ONLY)

LONG fires when ALL hold:
- `previous.rsi_1h < 22` (aggressive), `< 27` (moderate), `< 18` (conservative). DO NOT relax — this is the extreme-tail entry.
- `previous.rsi_15m > 30` (some recovery from the bottom)
- `previous.macd_15m_flipped_positive == true` (early momentum flip confirmed)
- `previous.close_above_low_12_pct >= 0.3` (proof the local bottom is in)

No HTF filter. Size: 30% aggressive / 20% moderate / 12% conservative. 60-min anti-wash window after this entry's exit (no Path A re-entry inside that window).

#### Path C — Trend continuation pullback

LONG fires when ALL hold:
- `previous.tf_buy_count >= 3` (3-of-4 timeframes BUY or STRONG_BUY)
- `previous.rsi_1h < 60` (not yet overbought — leaves room)
- `previous.macd_15m_histogram > 0` (15m is going up)
- `previous.atr_pct >= 1.0` (enough volatility for a meaningful continuation)
- `previous.regime != "bear"`

Catches the **mid-trend pullback** that Path A (oversold) and Path D (4/4 + breakout) both miss. Size: 35% aggressive / 25% moderate / 15% conservative. 30-min anti-wash window.

#### Path B — Deep-value counter-trend

LONG fires when ALL hold:
- `previous.rsi_daily < 30` AND `previous.rsi_weekly < 35`
- `previous.tf_4h ∈ {BUY, STRONG_BUY, NEUTRAL}` (4h reversing up)
- `previous.tf_1h ∈ {BUY, STRONG_BUY}` AND `previous.rsi_15m >= 50`
- `previous.macd_15m_flipped_positive == true` (15m momentum confirms — required to avoid catching a falling knife)

Size: 65% aggressive / 50% moderate / 30% conservative.

#### Path D — Confirmed momentum

LONG fires when ALL hold:
- `previous.tf_buy_count >= config.fullAlignmentBars` (default 4 = strict, 3 = looser)
- `previous.breakout_last_24_periods == true` (15m close above the 24-bar high)
- `previous.volume_confirm_15m == true` (15m vol_ratio ≥ 1.3)
- `previous.atr_pct >= 1.5`

Size: 65% aggressive / 50% moderate / 30% conservative.

### Default

If no path fires → `hold`.

## Anti-wash trade rule

After a full take-profit / final scalp / stop / trailing / reversal exit, the next 30 min ONLY allows Path A (oversold dip) or Path E (capitulation). Path B / Path C / Path D are forbidden in that window regardless of signal. The runtime SELL GUARD + 2h BUY cooldown back this up at the code level — your job is to not even propose a forbidden re-entry.

## Output schema (your last message MUST be a single-line JSON object — no markdown fences, just one line)

```json
{"decision":"<buy|sell|hold>","path":"<A|B|C|D|E|stop|tp|scalp|trailing|reversal|null>","size_pct":<number 0-100 or null>,"scalp_pct":<33|null>,"reasoning":"<one short sentence>"}
```

The orchestrator parses your LAST line as JSON. Emit it on a single line, no code fence, no trailing prose. The skip_condition `previous.decision == "hold"` requires a parseable JSON; if you wrap the line in markdown the orchestrator falls back to a string and execute spawns wastefully.

If `previous.unavailable == true` → `{"decision":"hold","path":null,"size_pct":null,"scalp_pct":null,"reasoning":"indicators unavailable"}`.
full-plus-sizing overrides 1 stage: 02-decide
02-decide.md  diff vs base
You are the **decide** stage of the trading workflow.
… 10 unchanged lines …
**Default = HOLD.** Only emit `buy` / `sell` when an explicit rule fires below.
- Risk thresholds come from `strategy.config` in the system prompt: `entryRsiThreshold`, `fullAlignmentBars`, `spotEntryPct`, `maxExposurePct`, `scalpRsiThreshold`. Defaults below assume the aggressive tier; moderate / conservative override via the config knobs.
+ **Tier override = MODERATE.** Use the moderate tier values everywhere a tier is mentioned (`entryRsiThreshold = 42`, sizing as listed below). This caps the exposure on counter-trend entries vs the aggressive default.
### Position-already-open path (`previous.vault_position_token_amount > 0`)
Test exits in priority order. First match wins.
+ **Min-hold protection (counter-trend):** When `previous.open_position_entry_path ∈ {"B", "E"}` AND `previous.open_position_ticks_since_buy < 2`, the only exits allowed are `stop` (safety) and `tp` (full take-profit). Skip `scalp`, `trailing`, and `reversal` — counter-trend entries need at least 2 tick bars to let the rebound develop. If neither stop nor tp fires within this window → `hold`.
+
**Stop-loss:** `previous.price <= previous.open_position_stop_loss_usd` → `sell`, `path: "stop"`, full close.
… 4 unchanged lines …
**Trailing exit:** the orchestrator does not have a way to compute "NET PnL" without arithmetic, so this path requires `previous.tf_15m` flipping to `SELL` AND `previous.macd_15m_histogram < 0` AND `previous.price > previous.open_position_cost_basis_usd / previous.vault_position_token_amount`. (The position is up vs cost basis AND momentum is rolling over.) → `sell`, `path: "trailing"`.
- **Trend reversal:** `previous.tf_4h ∈ {SELL, STRONG_SELL}` AND `previous.tf_daily ∈ {SELL, STRONG_SELL}` → `sell`, `path: "reversal"`.
+ **Trend reversal:** `previous.tf_4h ∈ {SELL, STRONG_SELL}` AND `previous.tf_daily ∈ {SELL, STRONG_SELL}` AND `previous.open_position_entry_path ∉ {"B", "E"}` → `sell`, `path: "reversal"`. **Excluded for B/E entries**: those paths enter deliberately counter-trend, so a still-bearish HTF is the entry premise, not a reversal — let stop/tp/scalp/trailing handle the exit.
If none fire → `hold`.
… 3 unchanged lines …
**HARD GUARD — read before everything else in this section.** When `previous.vault_position_token_amount == 0` you hold zero of the trading token, so you have NOTHING to sell. Exits (`stop`, `tp`, `scalp`, `trailing`, `reversal`) are FORBIDDEN here regardless of how bearish the timeframes look — they exist ONLY in the Position-already-open path above. The only valid emissions when position is 0 are: `hold`, or `buy` with one of the entry paths A / B / C / D / E. Emitting `{"decision":"sell", ...}` with `vault_position_token_amount == 0` is a hard contract violation: there is no inventory to dispose of and the orchestrator will reject it.
- Test in priority order. First match wins. Use `config.entryRsiThreshold` (default 45 aggressive / 42 moderate / 40 conservative) where shown.
+ Test in priority order. First match wins. Use **moderate tier**: `entryRsiThreshold = 42`.
#### Path A — Short-timeframe mean-reversion
LONG fires when ALL hold:
- - `previous.rsi_1h < config.entryRsiThreshold`
+ - `previous.rsi_1h < 42` (moderate threshold)
- `previous.rsi_15m_crossed_up_from_below_35 == true` (15m oversold reversal confirmed)
- `previous.macd_15m_flipped_positive == true` (15m momentum flipped within the last 2 bars)
- `previous.tf_daily ∉ {SELL, STRONG_SELL}` (1d not bearish — daily-flat-or-better)
- Size: `config.spotEntryPct.A` (default 50% aggressive / 35% moderate / 20% conservative).
+ Size: **35%** (moderate).
#### Path E — Capitulation oversold (BYPASS HTF wall, SPOT-ONLY)
LONG fires when ALL hold:
- - `previous.rsi_1h < 22` (aggressive), `< 27` (moderate), `< 18` (conservative). DO NOT relax — this is the extreme-tail entry.
+ - `previous.rsi_1h < 27` (moderate threshold). DO NOT relax — this is the extreme-tail entry.
- `previous.rsi_15m > 30` (some recovery from the bottom)
- `previous.macd_15m_flipped_positive == true` (early momentum flip confirmed)
- `previous.close_above_low_12_pct >= 0.3` (proof the local bottom is in)
- No HTF filter. Size: 30% aggressive / 20% moderate / 12% conservative. 60-min anti-wash window after this entry's exit (no Path A re-entry inside that window).
+ No HTF filter. Size: **20%** (moderate). 60-min anti-wash window after this entry's exit.
#### Path C — Trend continuation pullback
LONG fires when ALL hold:
- `previous.tf_buy_count >= 3` (3-of-4 timeframes BUY or STRONG_BUY)
- - `previous.rsi_1h < 60` (not yet overbought — leaves room)
+ - `previous.rsi_1h < 60` (not yet overbought)
- `previous.macd_15m_histogram > 0` (15m is going up)
- - `previous.atr_pct >= 1.0` (enough volatility for a meaningful continuation)
+ - `previous.atr_pct >= 1.0`
- `previous.regime != "bear"`
- Catches the **mid-trend pullback** that Path A (oversold) and Path D (4/4 + breakout) both miss. Size: 35% aggressive / 25% moderate / 15% conservative. 30-min anti-wash window.
+ Size: **25%** (moderate). 30-min anti-wash window.
#### Path B — Deep-value counter-trend
… 3 unchanged lines …
- `previous.tf_4h ∈ {BUY, STRONG_BUY, NEUTRAL}` (4h reversing up)
- `previous.tf_1h ∈ {BUY, STRONG_BUY}` AND `previous.rsi_15m >= 50`
+ - `previous.macd_15m_flipped_positive == true` (15m momentum confirms — required to avoid catching a falling knife)
- Size: 65% aggressive / 50% moderate / 30% conservative.
+ Size: **50%** (moderate, down from 65% aggressive).
#### Path D — Confirmed momentum
LONG fires when ALL hold:
- - `previous.tf_buy_count >= config.fullAlignmentBars` (default 4 = strict, 3 = looser)
- - `previous.breakout_last_24_periods == true` (15m close above the 24-bar high)
- - `previous.volume_confirm_15m == true` (15m vol_ratio ≥ 1.3)
+ - `previous.tf_buy_count >= 3` (moderate alignment, looser than aggressive 4/4)
+ - `previous.breakout_last_24_periods == true`
+ - `previous.volume_confirm_15m == true`
- `previous.atr_pct >= 1.5`
- Size: 65% aggressive / 50% moderate / 30% conservative.
+ Size: **50%** (moderate).
### Default
… 3 unchanged lines …
## Anti-wash trade rule
- After a full take-profit / final scalp / stop / trailing / reversal exit, the next 30 min ONLY allows Path A (oversold dip) or Path E (capitulation). Path B / Path C / Path D are forbidden in that window regardless of signal. The runtime SELL GUARD + 2h BUY cooldown back this up at the code level — your job is to not even propose a forbidden re-entry.
+ After a full take-profit / final scalp / stop / trailing / reversal exit, the next 30 min ONLY allows Path A (oversold dip) or Path E (capitulation). Path B / Path C / Path D are forbidden in that window regardless of signal.
## Output schema (your last message MUST be a single-line JSON object — no markdown fences, just one line)
… 3 unchanged lines …
```
- The orchestrator parses your LAST line as JSON. Emit it on a single line, no code fence, no trailing prose. The skip_condition `previous.decision == "hold"` requires a parseable JSON; if you wrap the line in markdown the orchestrator falls back to a string and execute spawns wastefully.
+ The orchestrator parses your LAST line as JSON. Emit it on a single line, no code fence, no trailing prose.
If `previous.unavailable == true` → `{"decision":"hold","path":null,"size_pct":null,"scalp_pct":null,"reasoning":"indicators unavailable"}`.
show full prompt (variant)
You are the **decide** stage of the trading workflow.

Apply the strict v30 rules to research's output and pick exactly one action. **NO arithmetic.** Compare values directly with the listed thresholds. Do not derive flags, do not recompute MACD/RSI/EMA, do not interpolate.

## Previous stage output

```json
{{previous}}
```

## Decision rules

**Default = HOLD.** Only emit `buy` / `sell` when an explicit rule fires below.

**Tier override = MODERATE.** Use the moderate tier values everywhere a tier is mentioned (`entryRsiThreshold = 42`, sizing as listed below). This caps the exposure on counter-trend entries vs the aggressive default.

### Position-already-open path (`previous.vault_position_token_amount > 0`)

Test exits in priority order. First match wins.

**Min-hold protection (counter-trend):** When `previous.open_position_entry_path ∈ {"B", "E"}` AND `previous.open_position_ticks_since_buy < 2`, the only exits allowed are `stop` (safety) and `tp` (full take-profit). Skip `scalp`, `trailing`, and `reversal` — counter-trend entries need at least 2 tick bars to let the rebound develop. If neither stop nor tp fires within this window → `hold`.

**Stop-loss:** `previous.price <= previous.open_position_stop_loss_usd` → `sell`, `path: "stop"`, full close.

**Full take-profit:** `previous.price >= previous.open_position_tp_target_usd` → `sell`, `path: "tp"`, full close.

**Quick scalp (33%):** `previous.price >= previous.open_position_scalp_target_usd` AND (`previous.rsi_1h >= scalpRsiThreshold` OR `previous.rsi_15m >= scalpRsiThreshold + 5`) → `sell`, `path: "scalp"`, `scalp_pct: 33`.

**Trailing exit:** the orchestrator does not have a way to compute "NET PnL" without arithmetic, so this path requires `previous.tf_15m` flipping to `SELL` AND `previous.macd_15m_histogram < 0` AND `previous.price > previous.open_position_cost_basis_usd / previous.vault_position_token_amount`. (The position is up vs cost basis AND momentum is rolling over.) → `sell`, `path: "trailing"`.

**Trend reversal:** `previous.tf_4h ∈ {SELL, STRONG_SELL}` AND `previous.tf_daily ∈ {SELL, STRONG_SELL}` AND `previous.open_position_entry_path ∉ {"B", "E"}` → `sell`, `path: "reversal"`. **Excluded for B/E entries**: those paths enter deliberately counter-trend, so a still-bearish HTF is the entry premise, not a reversal — let stop/tp/scalp/trailing handle the exit.

If none fire → `hold`.

### No-position path (`previous.vault_position_token_amount == 0`)

**HARD GUARD — read before everything else in this section.** When `previous.vault_position_token_amount == 0` you hold zero of the trading token, so you have NOTHING to sell. Exits (`stop`, `tp`, `scalp`, `trailing`, `reversal`) are FORBIDDEN here regardless of how bearish the timeframes look — they exist ONLY in the Position-already-open path above. The only valid emissions when position is 0 are: `hold`, or `buy` with one of the entry paths A / B / C / D / E. Emitting `{"decision":"sell", ...}` with `vault_position_token_amount == 0` is a hard contract violation: there is no inventory to dispose of and the orchestrator will reject it.

Test in priority order. First match wins. Use **moderate tier**: `entryRsiThreshold = 42`.

#### Path A — Short-timeframe mean-reversion

LONG fires when ALL hold:
- `previous.rsi_1h < 42` (moderate threshold)
- `previous.rsi_15m_crossed_up_from_below_35 == true` (15m oversold reversal confirmed)
- `previous.macd_15m_flipped_positive == true` (15m momentum flipped within the last 2 bars)
- `previous.tf_daily ∉ {SELL, STRONG_SELL}` (1d not bearish — daily-flat-or-better)

Size: **35%** (moderate).

#### Path E — Capitulation oversold (BYPASS HTF wall, SPOT-ONLY)

LONG fires when ALL hold:
- `previous.rsi_1h < 27` (moderate threshold). DO NOT relax — this is the extreme-tail entry.
- `previous.rsi_15m > 30` (some recovery from the bottom)
- `previous.macd_15m_flipped_positive == true` (early momentum flip confirmed)
- `previous.close_above_low_12_pct >= 0.3` (proof the local bottom is in)

No HTF filter. Size: **20%** (moderate). 60-min anti-wash window after this entry's exit.

#### Path C — Trend continuation pullback

LONG fires when ALL hold:
- `previous.tf_buy_count >= 3` (3-of-4 timeframes BUY or STRONG_BUY)
- `previous.rsi_1h < 60` (not yet overbought)
- `previous.macd_15m_histogram > 0` (15m is going up)
- `previous.atr_pct >= 1.0`
- `previous.regime != "bear"`

Size: **25%** (moderate). 30-min anti-wash window.

#### Path B — Deep-value counter-trend

LONG fires when ALL hold:
- `previous.rsi_daily < 30` AND `previous.rsi_weekly < 35`
- `previous.tf_4h ∈ {BUY, STRONG_BUY, NEUTRAL}` (4h reversing up)
- `previous.tf_1h ∈ {BUY, STRONG_BUY}` AND `previous.rsi_15m >= 50`
- `previous.macd_15m_flipped_positive == true` (15m momentum confirms — required to avoid catching a falling knife)

Size: **50%** (moderate, down from 65% aggressive).

#### Path D — Confirmed momentum

LONG fires when ALL hold:
- `previous.tf_buy_count >= 3` (moderate alignment, looser than aggressive 4/4)
- `previous.breakout_last_24_periods == true`
- `previous.volume_confirm_15m == true`
- `previous.atr_pct >= 1.5`

Size: **50%** (moderate).

### Default

If no path fires → `hold`.

## Anti-wash trade rule

After a full take-profit / final scalp / stop / trailing / reversal exit, the next 30 min ONLY allows Path A (oversold dip) or Path E (capitulation). Path B / Path C / Path D are forbidden in that window regardless of signal.

## Output schema (your last message MUST be a single-line JSON object — no markdown fences, just one line)

```json
{"decision":"<buy|sell|hold>","path":"<A|B|C|D|E|stop|tp|scalp|trailing|reversal|null>","size_pct":<number 0-100 or null>,"scalp_pct":<33|null>,"reasoning":"<one short sentence>"}
```

The orchestrator parses your LAST line as JSON. Emit it on a single line, no code fence, no trailing prose.

If `previous.unavailable == true` → `{"decision":"hold","path":null,"size_pct":null,"scalp_pct":null,"reasoning":"indicators unavailable"}`.
no-bear-pathB overrides 1 stage: 02-decide
02-decide.md  diff vs base
You are the **decide** stage of the trading workflow.
… 10 unchanged lines …
**Default = HOLD.** Only emit `buy` / `sell` when an explicit rule fires below.
- Risk thresholds come from `strategy.config` in the system prompt: `entryRsiThreshold`, `fullAlignmentBars`, `spotEntryPct`, `maxExposurePct`, `scalpRsiThreshold`. Defaults below assume the aggressive tier; moderate / conservative override via the config knobs.
+ **Tier override = MODERATE.** Use the moderate tier values everywhere a tier is mentioned (`entryRsiThreshold = 42`, sizing as listed below). This caps the exposure on counter-trend entries vs the aggressive default.
### Position-already-open path (`previous.vault_position_token_amount > 0`)
Test exits in priority order. First match wins.
+ **Min-hold protection (counter-trend):** When `previous.open_position_entry_path ∈ {"B", "E"}` AND `previous.open_position_ticks_since_buy < 2`, the only exits allowed are `stop` (safety) and `tp` (full take-profit). Skip `scalp`, `trailing`, and `reversal` — counter-trend entries need at least 2 tick bars to let the rebound develop. If neither stop nor tp fires within this window → `hold`.
+
**Stop-loss:** `previous.price <= previous.open_position_stop_loss_usd` → `sell`, `path: "stop"`, full close.
… 4 unchanged lines …
**Trailing exit:** the orchestrator does not have a way to compute "NET PnL" without arithmetic, so this path requires `previous.tf_15m` flipping to `SELL` AND `previous.macd_15m_histogram < 0` AND `previous.price > previous.open_position_cost_basis_usd / previous.vault_position_token_amount`. (The position is up vs cost basis AND momentum is rolling over.) → `sell`, `path: "trailing"`.
- **Trend reversal:** `previous.tf_4h ∈ {SELL, STRONG_SELL}` AND `previous.tf_daily ∈ {SELL, STRONG_SELL}` → `sell`, `path: "reversal"`.
+ **Trend reversal:** `previous.tf_4h ∈ {SELL, STRONG_SELL}` AND `previous.tf_daily ∈ {SELL, STRONG_SELL}` AND `previous.open_position_entry_path ∉ {"B", "E"}` → `sell`, `path: "reversal"`. **Excluded for B/E entries**: those paths enter deliberately counter-trend, so a still-bearish HTF is the entry premise, not a reversal — let stop/tp/scalp/trailing handle the exit.
If none fire → `hold`.
… 3 unchanged lines …
**HARD GUARD — read before everything else in this section.** When `previous.vault_position_token_amount == 0` you hold zero of the trading token, so you have NOTHING to sell. Exits (`stop`, `tp`, `scalp`, `trailing`, `reversal`) are FORBIDDEN here regardless of how bearish the timeframes look — they exist ONLY in the Position-already-open path above. The only valid emissions when position is 0 are: `hold`, or `buy` with one of the entry paths A / B / C / D / E. Emitting `{"decision":"sell", ...}` with `vault_position_token_amount == 0` is a hard contract violation: there is no inventory to dispose of and the orchestrator will reject it.
- Test in priority order. First match wins. Use `config.entryRsiThreshold` (default 45 aggressive / 42 moderate / 40 conservative) where shown.
+ Test in priority order. First match wins. Use **moderate tier**: `entryRsiThreshold = 42`.
#### Path A — Short-timeframe mean-reversion
LONG fires when ALL hold:
- - `previous.rsi_1h < config.entryRsiThreshold`
+ - `previous.rsi_1h < 42` (moderate threshold)
- `previous.rsi_15m_crossed_up_from_below_35 == true` (15m oversold reversal confirmed)
- `previous.macd_15m_flipped_positive == true` (15m momentum flipped within the last 2 bars)
- `previous.tf_daily ∉ {SELL, STRONG_SELL}` (1d not bearish — daily-flat-or-better)
- Size: `config.spotEntryPct.A` (default 50% aggressive / 35% moderate / 20% conservative).
+ Size: **35%** (moderate).
#### Path E — Capitulation oversold (BYPASS HTF wall, SPOT-ONLY)
LONG fires when ALL hold:
- - `previous.rsi_1h < 22` (aggressive), `< 27` (moderate), `< 18` (conservative). DO NOT relax — this is the extreme-tail entry.
+ - `previous.rsi_1h < 27` (moderate threshold). DO NOT relax — this is the extreme-tail entry.
- `previous.rsi_15m > 30` (some recovery from the bottom)
- `previous.macd_15m_flipped_positive == true` (early momentum flip confirmed)
- `previous.close_above_low_12_pct >= 0.3` (proof the local bottom is in)
- No HTF filter. Size: 30% aggressive / 20% moderate / 12% conservative. 60-min anti-wash window after this entry's exit (no Path A re-entry inside that window).
+ No HTF filter. Size: **20%** (moderate). 60-min anti-wash window after this entry's exit.
#### Path C — Trend continuation pullback
LONG fires when ALL hold:
- `previous.tf_buy_count >= 3` (3-of-4 timeframes BUY or STRONG_BUY)
- - `previous.rsi_1h < 60` (not yet overbought — leaves room)
+ - `previous.rsi_1h < 60` (not yet overbought)
- `previous.macd_15m_histogram > 0` (15m is going up)
- - `previous.atr_pct >= 1.0` (enough volatility for a meaningful continuation)
+ - `previous.atr_pct >= 1.0`
- `previous.regime != "bear"`
- Catches the **mid-trend pullback** that Path A (oversold) and Path D (4/4 + breakout) both miss. Size: 35% aggressive / 25% moderate / 15% conservative. 30-min anti-wash window.
+ Size: **25%** (moderate). 30-min anti-wash window.
#### Path B — Deep-value counter-trend
… 3 unchanged lines …
- `previous.tf_4h ∈ {BUY, STRONG_BUY, NEUTRAL}` (4h reversing up)
- `previous.tf_1h ∈ {BUY, STRONG_BUY}` AND `previous.rsi_15m >= 50`
+ - `previous.macd_15m_flipped_positive == true` (15m momentum confirms — required to avoid catching a falling knife)
+ - `previous.regime != "bear"` (DO NOT fire Path B inside a bear regime — historical evidence shows Path B + bear → reversal exit loop with net negative expectation)
- Size: 65% aggressive / 50% moderate / 30% conservative.
+ Size: **50%** (moderate, down from 65% aggressive).
#### Path D — Confirmed momentum
LONG fires when ALL hold:
- - `previous.tf_buy_count >= config.fullAlignmentBars` (default 4 = strict, 3 = looser)
- - `previous.breakout_last_24_periods == true` (15m close above the 24-bar high)
- - `previous.volume_confirm_15m == true` (15m vol_ratio ≥ 1.3)
+ - `previous.tf_buy_count >= 3` (moderate alignment, looser than aggressive 4/4)
+ - `previous.breakout_last_24_periods == true`
+ - `previous.volume_confirm_15m == true`
- `previous.atr_pct >= 1.5`
- Size: 65% aggressive / 50% moderate / 30% conservative.
+ Size: **50%** (moderate).
### Default
… 3 unchanged lines …
## Anti-wash trade rule
- After a full take-profit / final scalp / stop / trailing / reversal exit, the next 30 min ONLY allows Path A (oversold dip) or Path E (capitulation). Path B / Path C / Path D are forbidden in that window regardless of signal. The runtime SELL GUARD + 2h BUY cooldown back this up at the code level — your job is to not even propose a forbidden re-entry.
+ After a full take-profit / final scalp / stop / trailing / reversal exit, the next 30 min ONLY allows Path A (oversold dip) or Path E (capitulation). Path B / Path C / Path D are forbidden in that window regardless of signal.
## Output schema (your last message MUST be a single-line JSON object — no markdown fences, just one line)
… 3 unchanged lines …
```
- The orchestrator parses your LAST line as JSON. Emit it on a single line, no code fence, no trailing prose. The skip_condition `previous.decision == "hold"` requires a parseable JSON; if you wrap the line in markdown the orchestrator falls back to a string and execute spawns wastefully.
+ The orchestrator parses your LAST line as JSON. Emit it on a single line, no code fence, no trailing prose.
If `previous.unavailable == true` → `{"decision":"hold","path":null,"size_pct":null,"scalp_pct":null,"reasoning":"indicators unavailable"}`.
show full prompt (variant)
You are the **decide** stage of the trading workflow.

Apply the strict v30 rules to research's output and pick exactly one action. **NO arithmetic.** Compare values directly with the listed thresholds. Do not derive flags, do not recompute MACD/RSI/EMA, do not interpolate.

## Previous stage output

```json
{{previous}}
```

## Decision rules

**Default = HOLD.** Only emit `buy` / `sell` when an explicit rule fires below.

**Tier override = MODERATE.** Use the moderate tier values everywhere a tier is mentioned (`entryRsiThreshold = 42`, sizing as listed below). This caps the exposure on counter-trend entries vs the aggressive default.

### Position-already-open path (`previous.vault_position_token_amount > 0`)

Test exits in priority order. First match wins.

**Min-hold protection (counter-trend):** When `previous.open_position_entry_path ∈ {"B", "E"}` AND `previous.open_position_ticks_since_buy < 2`, the only exits allowed are `stop` (safety) and `tp` (full take-profit). Skip `scalp`, `trailing`, and `reversal` — counter-trend entries need at least 2 tick bars to let the rebound develop. If neither stop nor tp fires within this window → `hold`.

**Stop-loss:** `previous.price <= previous.open_position_stop_loss_usd` → `sell`, `path: "stop"`, full close.

**Full take-profit:** `previous.price >= previous.open_position_tp_target_usd` → `sell`, `path: "tp"`, full close.

**Quick scalp (33%):** `previous.price >= previous.open_position_scalp_target_usd` AND (`previous.rsi_1h >= scalpRsiThreshold` OR `previous.rsi_15m >= scalpRsiThreshold + 5`) → `sell`, `path: "scalp"`, `scalp_pct: 33`.

**Trailing exit:** the orchestrator does not have a way to compute "NET PnL" without arithmetic, so this path requires `previous.tf_15m` flipping to `SELL` AND `previous.macd_15m_histogram < 0` AND `previous.price > previous.open_position_cost_basis_usd / previous.vault_position_token_amount`. (The position is up vs cost basis AND momentum is rolling over.) → `sell`, `path: "trailing"`.

**Trend reversal:** `previous.tf_4h ∈ {SELL, STRONG_SELL}` AND `previous.tf_daily ∈ {SELL, STRONG_SELL}` AND `previous.open_position_entry_path ∉ {"B", "E"}` → `sell`, `path: "reversal"`. **Excluded for B/E entries**: those paths enter deliberately counter-trend, so a still-bearish HTF is the entry premise, not a reversal — let stop/tp/scalp/trailing handle the exit.

If none fire → `hold`.

### No-position path (`previous.vault_position_token_amount == 0`)

**HARD GUARD — read before everything else in this section.** When `previous.vault_position_token_amount == 0` you hold zero of the trading token, so you have NOTHING to sell. Exits (`stop`, `tp`, `scalp`, `trailing`, `reversal`) are FORBIDDEN here regardless of how bearish the timeframes look — they exist ONLY in the Position-already-open path above. The only valid emissions when position is 0 are: `hold`, or `buy` with one of the entry paths A / B / C / D / E. Emitting `{"decision":"sell", ...}` with `vault_position_token_amount == 0` is a hard contract violation: there is no inventory to dispose of and the orchestrator will reject it.

Test in priority order. First match wins. Use **moderate tier**: `entryRsiThreshold = 42`.

#### Path A — Short-timeframe mean-reversion

LONG fires when ALL hold:
- `previous.rsi_1h < 42` (moderate threshold)
- `previous.rsi_15m_crossed_up_from_below_35 == true` (15m oversold reversal confirmed)
- `previous.macd_15m_flipped_positive == true` (15m momentum flipped within the last 2 bars)
- `previous.tf_daily ∉ {SELL, STRONG_SELL}` (1d not bearish — daily-flat-or-better)

Size: **35%** (moderate).

#### Path E — Capitulation oversold (BYPASS HTF wall, SPOT-ONLY)

LONG fires when ALL hold:
- `previous.rsi_1h < 27` (moderate threshold). DO NOT relax — this is the extreme-tail entry.
- `previous.rsi_15m > 30` (some recovery from the bottom)
- `previous.macd_15m_flipped_positive == true` (early momentum flip confirmed)
- `previous.close_above_low_12_pct >= 0.3` (proof the local bottom is in)

No HTF filter. Size: **20%** (moderate). 60-min anti-wash window after this entry's exit.

#### Path C — Trend continuation pullback

LONG fires when ALL hold:
- `previous.tf_buy_count >= 3` (3-of-4 timeframes BUY or STRONG_BUY)
- `previous.rsi_1h < 60` (not yet overbought)
- `previous.macd_15m_histogram > 0` (15m is going up)
- `previous.atr_pct >= 1.0`
- `previous.regime != "bear"`

Size: **25%** (moderate). 30-min anti-wash window.

#### Path B — Deep-value counter-trend

LONG fires when ALL hold:
- `previous.rsi_daily < 30` AND `previous.rsi_weekly < 35`
- `previous.tf_4h ∈ {BUY, STRONG_BUY, NEUTRAL}` (4h reversing up)
- `previous.tf_1h ∈ {BUY, STRONG_BUY}` AND `previous.rsi_15m >= 50`
- `previous.macd_15m_flipped_positive == true` (15m momentum confirms — required to avoid catching a falling knife)
- `previous.regime != "bear"` (DO NOT fire Path B inside a bear regime — historical evidence shows Path B + bear → reversal exit loop with net negative expectation)

Size: **50%** (moderate, down from 65% aggressive).

#### Path D — Confirmed momentum

LONG fires when ALL hold:
- `previous.tf_buy_count >= 3` (moderate alignment, looser than aggressive 4/4)
- `previous.breakout_last_24_periods == true`
- `previous.volume_confirm_15m == true`
- `previous.atr_pct >= 1.5`

Size: **50%** (moderate).

### Default

If no path fires → `hold`.

## Anti-wash trade rule

After a full take-profit / final scalp / stop / trailing / reversal exit, the next 30 min ONLY allows Path A (oversold dip) or Path E (capitulation). Path B / Path C / Path D are forbidden in that window regardless of signal.

## Output schema (your last message MUST be a single-line JSON object — no markdown fences, just one line)

```json
{"decision":"<buy|sell|hold>","path":"<A|B|C|D|E|stop|tp|scalp|trailing|reversal|null>","size_pct":<number 0-100 or null>,"scalp_pct":<33|null>,"reasoning":"<one short sentence>"}
```

The orchestrator parses your LAST line as JSON. Emit it on a single line, no code fence, no trailing prose.

If `previous.unavailable == true` → `{"decision":"hold","path":null,"size_pct":null,"scalp_pct":null,"reasoning":"indicators unavailable"}`.

Trade-by-trade detail

Click any run to expand its trade list.

base  btcusdc 2026-05-06_base_btcusdc_gemma4-31b-cloud_317438e4   open ↗ 5 BUY · 5 SELL   -1.64%
sim_tssidepathamount $price $cost %realized $realized %
2026-02-02 18:00:00 BUY B $6500.00 $78988.64 0.56%
2026-02-02 19:00:00 SELL reversal $6392.73 $78569.84 0.56% $-107.27 -1.65%
2026-02-03 01:00:00 BUY B $6429.97 $79065.24 0.56%
2026-02-03 02:00:00 SELL reversal $6353.81 $79017.63 0.56% $-76.17 -1.18%
2026-02-03 04:00:00 BUY B $6380.76 $78753.32 0.56%
2026-02-03 05:00:00 SELL reversal $6312.65 $78798.39 0.56% $-68.12 -1.07%
2026-02-06 01:00:00 BUY E $2924.53 $63509.39 0.53%
2026-02-06 02:00:00 SELL reversal $2994.13 $65714.96 0.53% +$69.59 +2.38%
2026-02-06 22:00:00 BUY B $6381.72 $70358.43 0.56%
2026-02-06 23:00:00 SELL reversal $6399.26 $71354.46 0.56% +$17.53 +0.27%
base  wethusdc 2026-05-06_base_wethusdc_gemma4-31b-cloud_b1fe07d3   open ↗ 10 BUY · 10 SELL   -7.63%
sim_tssidepathamount $price $cost %realized $realized %
2026-02-01 18:00:00 BUY E $3000.00 $2313.96 0.53%
2026-02-01 19:00:00 SELL reversal $3015.75 $2350.97 0.53% +$15.75 +0.53%
2026-02-06 20:00:00 BUY B $6510.24 $2065.63 0.57%
2026-02-06 21:00:00 SELL reversal $6401.39 $2054.23 0.56% $-108.85 -1.67%
2026-02-06 22:00:00 BUY B $6439.49 $2053.97 0.56%
2026-02-06 23:00:00 SELL reversal $6432.48 $2075.10 0.56% $-7.00 -0.11%
2026-02-07 00:00:00 BUY B $6434.93 $2063.38 0.56%
2026-02-07 01:00:00 SELL stop $6301.27 $2043.50 0.56% $-133.66 -2.08%
2026-02-07 02:00:00 BUY B $6348.05 $2061.94 0.56%
2026-02-07 03:00:00 SELL reversal $6268.98 $2059.39 0.56% $-79.07 -1.25%
2026-02-07 21:00:00 BUY B $6296.65 $2105.32 0.56%
2026-02-07 22:00:00 SELL reversal $6211.50 $2100.42 0.56% $-85.16 -1.35%
2026-02-07 23:00:00 BUY B $6241.30 $2088.58 0.56%
2026-02-08 00:00:00 SELL stop $6166.89 $2087.08 0.56% $-74.41 -1.19%
2026-02-12 14:00:00 BUY B $6192.93 $1994.99 0.56%
2026-02-12 15:00:00 SELL reversal $6072.97 $1978.50 0.56% $-119.97 -1.94%
2026-02-13 20:00:00 BUY B $6114.95 $2057.75 0.56%
2026-02-13 21:00:00 SELL reversal $6010.89 $2045.61 0.56% $-104.07 -1.70%
2026-02-13 22:00:00 BUY B $6047.31 $2054.02 0.56%
2026-02-13 23:00:00 SELL reversal $5980.26 $2054.20 0.56% $-67.05 -1.11%
full-counter-trend  btcusdc 2026-05-06_full-counter-trend_btcusdc_gemma4-31b-cloud_c16cd   open ↗ 1 BUY · 3 SELL   +1.47%
sim_tssidepathamount $price $cost %realized $realized %
2026-02-06 01:00:00 BUY E $3000.00 $63509.39 0.53%
2026-02-06 12:00:00 SELL scalp $1027.89 $66631.32 0.51% +$37.89 +3.83%
2026-02-06 13:00:00 SELL scalp $687.95 $66557.93 0.51% +$24.65 +3.72%
2026-02-06 15:00:00 SELL tp $1430.99 $68194.89 0.51% +$84.29 +6.26%
full-counter-trend  wethusdc 2026-05-06_full-counter-trend_wethusdc_gemma4-31b-cloud_d9d2   open ↗ 1 BUY · 1 SELL   -0.88%
sim_tssidepathamount $price $cost %realized $realized %
2026-02-01 18:00:00 BUY E $3000.00 $2313.96 0.53%
2026-02-02 00:00:00 SELL stop $2912.11 $2270.15 0.53% $-87.89 -2.93%
full-plus-sizing  btcusdc 2026-05-06_full-plus-sizing_btcusdc_gemma4-31b-cloud_ccac942   open ↗ 1 BUY · 5 SELL   +0.86%
sim_tssidepathamount $price $cost %realized $realized %
2026-02-06 01:00:00 BUY E $2000.00 $63509.39 0.52%
2026-02-06 06:00:00 SELL scalp $683.06 $66408.11 0.51% +$23.06 +3.49%
2026-02-06 12:00:00 SELL scalp $459.20 $66631.32 0.50% +$17.00 +3.84%
2026-02-06 13:00:00 SELL scalp $307.33 $66557.93 0.50% +$11.05 +3.73%
2026-02-06 14:00:00 SELL scalp $208.26 $67316.82 0.50% +$9.76 +4.91%
2026-02-06 15:00:00 SELL tp $428.33 $68194.89 0.50% +$25.31 +6.28%
full-plus-sizing  wethusdc 2026-05-06_full-plus-sizing_wethusdc_gemma4-31b-cloud_300745   open ↗ 2 BUY · 13 SELL   -1.03%
sim_tssidepathamount $price $cost %realized $realized %
2026-02-02 05:00:00 BUY E $1975.95 $2240.54 0.52%
2026-02-02 06:00:00 SELL stop $1918.36 $2198.02 0.52% $-57.59 -2.91%
2026-02-06 10:00:00 BUY E $1964.43 $1919.00 0.52%
2026-02-06 15:00:00 SELL scalp $661.65 $1978.88 0.51% +$13.39 +2.06%
2026-02-06 16:00:00 SELL scalp $443.75 $1980.81 0.50% +$9.41 +2.17%
2026-02-06 17:00:00 SELL scalp $305.62 $2036.17 0.50% +$14.62 +5.02%
2026-02-06 18:00:00 SELL scalp $207.87 $2067.01 0.50% +$12.90 +6.62%
2026-02-06 19:00:00 SELL scalp $137.77 $2044.61 0.50% +$7.13 +5.46%
2026-02-06 20:00:00 SELL scalp $93.25 $2065.63 0.50% +$5.73 +6.55%
2026-02-06 21:00:00 SELL scalp $62.13 $2054.23 0.50% +$3.49 +5.96%
2026-02-06 22:00:00 SELL scalp $41.62 $2053.97 0.50% +$2.34 +5.94%
2026-02-06 23:00:00 SELL scalp $28.18 $2075.10 0.50% +$1.85 +7.03%
2026-02-07 00:00:00 SELL scalp $18.77 $2063.38 0.50% +$1.13 +6.43%
2026-02-07 02:00:00 SELL scalp $12.57 $2061.94 0.50% +$0.75 +6.36%
2026-02-07 04:00:00 SELL tp $25.75 $2080.81 0.50% +$1.76 +7.33%
no-bear-pathB  btcusdc 2026-05-06_no-bear-pathB_btcusdc_gemma4-31b-cloud_dad2628e   open ↗ 1 BUY · 5 SELL   +0.86%
sim_tssidepathamount $price $cost %realized $realized %
2026-02-06 01:00:00 BUY E $2000.00 $63509.39 0.52%
2026-02-06 06:00:00 SELL scalp $683.06 $66408.11 0.51% +$23.06 +3.49%
2026-02-06 12:00:00 SELL scalp $459.20 $66631.32 0.50% +$17.00 +3.84%
2026-02-06 13:00:00 SELL scalp $307.33 $66557.93 0.50% +$11.05 +3.73%
2026-02-06 14:00:00 SELL scalp $208.26 $67316.82 0.50% +$9.76 +4.91%
2026-02-06 15:00:00 SELL tp $428.33 $68194.89 0.50% +$25.31 +6.28%
no-bear-pathB  wethusdc 2026-05-06_no-bear-pathB_wethusdc_gemma4-31b-cloud_0077e4f3   open ↗ 1 BUY · 1 SELL   -1.78%
sim_tssidepathamount $price $cost %realized $realized %
2026-02-02 05:00:00 BUY E $1975.95 $2240.54 0.52%
2026-02-02 06:00:00 SELL stop $1918.36 $2198.02 0.52% $-57.59 -2.91%

Run config

VariantPairRun IDPrompts FPStartedFinished
base btcusdc 2026-05-06_base_btcusdc_gemma4-31b-cloud_317438e4 5f80dcb4d5d69586 2026-05-06 16:48:11 2026-05-06 22:00:57
base wethusdc 2026-05-06_base_wethusdc_gemma4-31b-cloud_b1fe07d3 5f80dcb4d5d69586 2026-05-06 16:48:11 2026-05-06 21:59:57
full-counter-trend btcusdc 2026-05-06_full-counter-trend_btcusdc_gemma4-31b-cloud_c16cdd40 7a098dc44f79d94b 2026-05-06 16:48:11 2026-05-06 22:03:36
full-counter-trend wethusdc 2026-05-06_full-counter-trend_wethusdc_gemma4-31b-cloud_d9d2e32c 7a098dc44f79d94b 2026-05-06 16:48:10 2026-05-06 21:59:42
full-plus-sizing btcusdc 2026-05-06_full-plus-sizing_btcusdc_gemma4-31b-cloud_ccac9422 c27d60d41e3a943f 2026-05-06 16:48:11 2026-05-06 21:56:54
full-plus-sizing wethusdc 2026-05-06_full-plus-sizing_wethusdc_gemma4-31b-cloud_3007453f c27d60d41e3a943f 2026-05-06 16:48:11 2026-05-06 21:53:45
no-bear-pathB btcusdc 2026-05-06_no-bear-pathB_btcusdc_gemma4-31b-cloud_dad2628e 1c4fe6a536c9d03a 2026-05-06 16:48:11 2026-05-06 21:44:54
no-bear-pathB wethusdc 2026-05-06_no-bear-pathB_wethusdc_gemma4-31b-cloud_0077e4f3 1c4fe6a536c9d03a 2026-05-06 16:48:11 2026-05-06 22:04:24

Generated by src/04-build-report.mjs · 8 runs · 2026-05-07 05:14:53 UTC