Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions config.paper-hourly.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ caps:
# this profile's evidence is partly ABOUT rail behaviour (rail vetoes are admissible
# evidence), so silently clamping sizing here would bias exactly the thing being measured.
# Deliberately NOT raised to admit this profile's proposals. Rail 14 caps MONTHLY buy
# notional at the fee-free allowance ($500 at Basic), so a single ~$4,212 proposal is 8.4x
# notional at the monthly buy cap ($500 at Basic), so a single ~$4,212 proposal is 8.4x
# the entire month -- widening the exposure cap admits nothing and only hides the sizing
# mismatch that `starting_equity_usd` below actually fixes.
max_exposure_usd: 5000
Expand Down Expand Up @@ -144,12 +144,15 @@ paper:
# amount. Changed from 10000 (#426).
#
# The synthetic $10k made this profile unable to record anything. It inherits the REAL
# account's subscription allowance -- rail 14, attested Basic, $500/month of fee-free buy
# notional -- while sizing against an account 23x larger than the real one (~$450). At
# account's subscription allowance -- rail 14, attested Basic, $500/month buy
# cap -- while sizing against an account 23x larger than the real one (~$450). At
# risk_pct 1% and the measured 2.40% median hourly stop, f_N = risk_pct/s = 0.42, so a
# typical proposal was ~$4,212: 8.4x the whole monthly allowance. Every entry was refused.
# Over 60 cycles the profile detected 15 setups and recorded 0 trades.
#
# (#836, 2026-09-27: the "fee-free regime" below does not exist for keel's orders -- Advanced
# Trade charges its taker fee inside the cap too -- so these rules are losing throughout. The
# reasoning is kept as written.)
# Seeding from real equity keeps every proposal inside the fee-free regime, which is also
# the ONLY regime where these rules are not structurally losing: inside the allowance
# kappa = 0.04R and p_be(b=6) = 14.9%, against a reconstructed 14.9% win rate; outside it
Expand Down
28 changes: 17 additions & 11 deletions config.paperforward.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ risk_pct: 0.01

caps:
# max_per_order_usd / max_per_day_usd are OPTIONAL internal RISK limits, not real Coinbase
# limits -- Coinbase One's only subscription constraint is monthly fee-free trading VOLUME
# limits -- Coinbase One's only subscription constraint is a monthly zero-fee trading VOLUME -- on the
# main Coinbase platform only, not Advanced Trade where keel trades (#836) --
# (see `subscription:` below). They default to a non-binding $1B when omitted (Issue #85);
# set explicit values here only if you want an extra per-order/per-day risk ceiling tighter
# than the exposure/concentration caps below. Left at their non-binding default here so
Expand Down Expand Up @@ -78,8 +79,8 @@ paper:
# paper blocks are equal -- the profiles are meant to differ in CADENCE and nothing else.
#
# A synthetic account larger than the real one makes a paper profile propose orders the real
# deployment could never fund. Rail 14 caps monthly buy notional at the venue's fee-free
# allowance ($500 at the attested Basic tier), and that allowance is inherited from the REAL
# deployment could never fund. Rail 14 caps monthly buy notional at the venue's monthly
# buy cap ($500 at the attested Basic tier; a cap, not a fee waiver -- #836), and that allowance is inherited from the REAL
# account whatever the synthetic equity says. At $10k synthetic and the measured 13.86%
# median daily stop, f_N = 0.07 gives ~$722 per trade -- 1.4x the whole monthly allowance.
starting_equity_usd: 0
Expand All @@ -94,19 +95,22 @@ paper:
quote_currency: USD

subscription:
# The SIMULATOR's assumed fee-free monthly volume. The LIVE rail-14 cap is not set here --
# The SIMULATOR's assumed monthly volume allowance (priced at zero fee in the tier analysis,
# which is hypothetical for keel's Advanced Trade orders -- #836). The LIVE rail-14 cap is not set here --
# it comes from the attested record: `keel subscription attest --venue coinbase --tier <t>`.
assumed_free_volume_usd: 500
# What rail 14 permits on a venue that is unattested, suspect, lapsed, or overdue.
# 0 means such a venue cannot buy at all until it is attested.
unsubscribed_allowance_usd: 0
pacing: opportunistic # opportunistic (monthly cap only) | even_daily (also paces per business day)

# Coinbase One subscription tiers (Issue #86) -- fee-free monthly TRADING VOLUME (buys + sells)
# allowance per tier, used by `keel simulate`'s tier/fee analysis matrix to compare staying
# within a tier's free volume (throttled, 0 trading fees, but you still pay the subscription)
# against trading freely and paying the taker fee on volume EXCEEDING it.
# free_volume_usd: null means unlimited (Premium -- always fee-free, no cap to exceed).
# Coinbase One subscription tiers (Issue #86): each tier's monthly TRADING VOLUME (buys + sells)
# allowance, used by `keel simulate`'s tier/fee analysis matrix to compare staying within a
# tier's allowance (throttled, 0 trading fees, but you still pay the subscription) against
# trading freely and paying the taker fee on volume EXCEEDING it. That zero-fee allowance is a
# main-Coinbase-platform benefit, NOT Advanced Trade, where keel's orders pay maker/taker fees
# (#836) -- so the within-cap rows are hypothetical for keel.
# free_volume_usd: null means unlimited (Premium -- no cap to exceed).
tiers:
- name: Basic
free_volume_usd: 500
Expand All @@ -118,8 +122,10 @@ tiers:
free_volume_usd: null
subscription_usd_month: 299.99

# Coinbase Advanced trading fees applied to volume beyond a tier's free allowance, for a
# <$1k-30d-volume account (Coinbase's published fee schedule). taker_pct is the sim's default --
# Coinbase Advanced trading fees. They apply to EVERY keel order -- there is no free allowance
# on Advanced Trade (#836). On 2026-09-27 the account measured the Intro tier at 0.9% taker /
# 0.5% maker; these values are kept at 1.2% / 0.6% as the conservative sim figure, so recorded
# results stay comparable. taker_pct is the sim's default --
# it fills market-style at next-bar open; maker_pct is exposed for a caller that wants to model
# limit-order fills instead.
fees:
Expand Down
24 changes: 15 additions & 9 deletions config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ risk_pct: 0.01

caps:
# max_per_order_usd / max_per_day_usd are OPTIONAL internal RISK limits, not real Coinbase
# limits -- Coinbase One's only subscription constraint is monthly fee-free trading VOLUME
# limits -- Coinbase One's only subscription constraint is a monthly zero-fee trading VOLUME -- on the
# main Coinbase platform only, not Advanced Trade where keel trades (#836) --
# (see `subscription:` below). They default to a non-binding $1B when omitted (Issue #85);
# set explicit values here only if you want an extra per-order/per-day risk ceiling tighter
# than the exposure/concentration caps below. Left at their non-binding default here so
Expand Down Expand Up @@ -102,19 +103,22 @@ settlement_currencies:
- USDC

subscription:
# The SIMULATOR's assumed fee-free monthly volume. The LIVE rail-14 cap is not set here --
# The SIMULATOR's assumed monthly volume allowance (priced at zero fee in the tier analysis,
# which is hypothetical for keel's Advanced Trade orders -- #836). The LIVE rail-14 cap is not set here --
# it comes from the attested record: `keel subscription attest --venue coinbase --tier <t>`.
assumed_free_volume_usd: 500
# What rail 14 permits on a venue that is unattested, suspect, lapsed, or overdue.
# 0 means such a venue cannot buy at all until it is attested.
unsubscribed_allowance_usd: 0
pacing: opportunistic # opportunistic (monthly cap only) | even_daily (also paces per business day)

# Coinbase One subscription tiers (Issue #86) -- fee-free monthly TRADING VOLUME (buys + sells)
# allowance per tier, used by `keel simulate`'s tier/fee analysis matrix to compare staying
# within a tier's free volume (throttled, 0 trading fees, but you still pay the subscription)
# against trading freely and paying the taker fee on volume EXCEEDING it.
# free_volume_usd: null means unlimited (Premium -- always fee-free, no cap to exceed).
# Coinbase One subscription tiers (Issue #86): each tier's monthly TRADING VOLUME (buys + sells)
# allowance, used by `keel simulate`'s tier/fee analysis matrix to compare staying within a
# tier's allowance (throttled, 0 trading fees, but you still pay the subscription) against
# trading freely and paying the taker fee on volume EXCEEDING it. That zero-fee allowance is a
# main-Coinbase-platform benefit, NOT Advanced Trade, where keel's orders pay maker/taker fees
# (#836) -- so the within-cap rows are hypothetical for keel.
# free_volume_usd: null means unlimited (Premium -- no cap to exceed).
tiers:
- name: Basic
free_volume_usd: 500
Expand All @@ -126,8 +130,10 @@ tiers:
free_volume_usd: null
subscription_usd_month: 299.99

# Coinbase Advanced trading fees applied to volume beyond a tier's free allowance, for a
# <$1k-30d-volume account (Coinbase's published fee schedule). taker_pct is the sim's default --
# Coinbase Advanced trading fees. They apply to EVERY keel order -- there is no free allowance
# on Advanced Trade (#836). On 2026-09-27 the account measured the Intro tier at 0.9% taker /
# 0.5% maker; these values are kept at 1.2% / 0.6% as the conservative sim figure, so recorded
# results stay comparable. taker_pct is the sim's default --
# it fills market-style at next-bar open; maker_pct is exposed for a caller that wants to model
# limit-order fills instead.
fees:
Expand Down
8 changes: 8 additions & 0 deletions docs/experiments/2026-08-21-rule-family-significance.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Rule-family significance: is a family's edge distinguishable from zero at the fee actually paid?

> **Fee note (added 2026-09-27, #836).** This record describes a fee-free regime inside a
> venue's monthly allowance. For keel's orders that regime is **hypothetical**: they go through
> Coinbase Advanced Trade, which has no fee-waiver tier. On 2026-09-27 the account reported the
> Intro tier (0.9% taker, 0.5% maker, `has_promo_fee: false`), and every live fill had paid a
> fee; Coinbase One's zero trading fees apply on the main Coinbase platform, not Advanced
> Trade. Figures priced at the taker fee are the realistic ones; figures priced at zero fee
> describe a regime keel cannot reach. Nothing on this page has been rewritten.

**Issue #475.** Driver: [`2026-08-21-rule-family-significance.py`](2026-08-21-rule-family-significance.py)
(pre-registered in its docstring before the run). Artifact: every number below is a row of
[`2026-08-21-rule-family-significance.jsonl`](2026-08-21-rule-family-significance.jsonl) — 180
Expand Down
8 changes: 8 additions & 0 deletions docs/experiments/2026-08-22-trailing-vs-static-exits.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Trailing vs static exits: does the ratchet-only exit policy help, at the fee actually paid?

> **Fee note (added 2026-09-27, #836).** This record describes a fee-free regime inside a
> venue's monthly allowance. For keel's orders that regime is **hypothetical**: they go through
> Coinbase Advanced Trade, which has no fee-waiver tier. On 2026-09-27 the account reported the
> Intro tier (0.9% taker, 0.5% maker, `has_promo_fee: false`), and every live fill had paid a
> fee; Coinbase One's zero trading fees apply on the main Coinbase platform, not Advanced
> Trade. Figures priced at the taker fee are the realistic ones; figures priced at zero fee
> describe a regime keel cannot reach. Nothing on this page has been rewritten.

> **Cost note (added 2026-09-02).** The figures below are priced at the flat 5bp
> slippage floor. [the per-product restatement](2026-09-01-per-product-slippage-restatement.md) later measured that **no
> asset in keel's universe reaches that floor** — the range is 1.1× to 36.8× — so every
Expand Down
8 changes: 8 additions & 0 deletions docs/experiments/2026-09-05-restatement-restated.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# The 08-13 restatement, restated: the engine never moved the numbers — three weeks of candles did

> **Fee note (added 2026-09-27, #836).** This record describes a fee-free regime inside a
> venue's monthly allowance. For keel's orders that regime is **hypothetical**: they go through
> Coinbase Advanced Trade, which has no fee-waiver tier. On 2026-09-27 the account reported the
> Intro tier (0.9% taker, 0.5% maker, `has_promo_fee: false`), and every live fill had paid a
> fee; Coinbase One's zero trading fees apply on the main Coinbase platform, not Advanced
> Trade. Figures priced at the taker fee are the realistic ones; figures priced at zero fee
> describe a regime keel cannot reach. Nothing on this page has been rewritten.

**Date:** 2026-09-05 · **Restates:**
[`2026-08-13-restated-under-a-production-faithful-engine.md`](2026-08-13-restated-under-a-production-faithful-engine.md)
· **Engine:** `keel` at `main`, every code path this run exercises **byte-identical to `v0.13.3`**
Expand Down
7 changes: 7 additions & 0 deletions docs/experiments/2026-09-27-accumulation-policy.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Accumulation policy after fees: no arm beats static DCA

> **Fee note (added 2026-09-27, #836).** The headline "allowance-aware" fee model priced buys
> fee-free up to $500 a month. For keel's orders that regime is **hypothetical**: they go
> through Coinbase Advanced Trade, which charges its maker/taker schedule on every order (0.9%
> taker on 2026-09-27), so the **flat-taker sensitivity run is the one that matches live**. The
> verdict is identical under both fee models, so it is unaffected. Nothing on this page has
> been rewritten.

**Date:** 2026-09-27
**Issue:** #831 · **Design:** [`2026-09-27-accumulation-policy-design.md`](../superpowers/specs/2026-09-27-accumulation-policy-design.md)
(revision 2, approved as #834)
Expand Down
3 changes: 2 additions & 1 deletion docs/operator-runbook.md
Original file line number Diff line number Diff line change
Expand Up @@ -998,7 +998,8 @@ fourth does not, which is most of why they drift apart.
actual equity it stops binding before available cash does, and the refusal comes later and less
legibly from the funding check (rail 13). In paper mode the proxy is bypassed: sizing uses the
paper account's own equity.
- **rail 14's monthly allowance** — the fee-free monthly BUY volume. It lives in the **database,
- **rail 14's monthly buy cap** — the most the agent may BUY in a UTC month. It is a cap, not a
fee waiver: Advanced Trade orders pay the venue's maker/taker fee inside it (#836). It lives in the **database,
not `config.yaml`**: the `broker_subscriptions` row written by `keel subscription attest --venue
coinbase --tier <tier>`, or set directly with `keel subscription set --free-volume-usd N`.
`config.yaml` only supplies the tier catalogue and the unattested fallback
Expand Down
40 changes: 21 additions & 19 deletions docs/rails/rail-14-subscription-allowance.md
Original file line number Diff line number Diff line change
@@ -1,25 +1,27 @@
# Rail 14 — subscription allowance (the fee-free monthly volume cap)
# Rail 14 — the monthly buy cap

Rail 14 is one of keel's hard rails: checks in `keel/execution/guards.py` that run before every
order, in every mode, and cannot be switched off or widened from `config.yaml`. This one caps
the **month-to-date live BUY notional** — everything the agent has bought this UTC calendar
month, from the orders audit log, plus the order being placed — at the venue's **fee-free
monthly volume allowance**.

## What it bounds — and why that is a profitability boundary, not a budget

The cap is the subscription tier's `free_volume_usd`: the monthly volume the venue (Coinbase
Advanced Trade, at time of writing) lets the account trade **taker-fee-free**. That makes the
rail's economics, not just its accounting:

> Inside the allowance the measured strategies are indistinguishable from break-even; outside
> it the taker fee (120 bp) makes them decisively negative. **"It is not a budget limit; it is
> the profitability boundary."**
> — `docs/research/2026-08-20-quant-lab-note-cross-verification.md`, §5

On the hourly clock every round trip outside the allowance costs more than one full unit of
risk, so the rail is what keeps the agent from buying a known-losing trade. DCA is **not**
exempt — recurring buys are exactly the spend this rail exists to cap.
month, from the orders audit log, plus the order being placed — at the venue's attested
**monthly buy cap** (`free_volume_usd` in the record; the field keeps its historical name).

## What it bounds: spend, not fees

The cap is a limit keel puts on its **own** buying. It is not a fee waiver, and nothing inside
it is free: keel places its orders through **Coinbase Advanced Trade**, which charges its
maker/taker schedule on every order whatever the cap says (#836). DCA is **not** exempt —
recurring buys are exactly the spend this rail exists to cap.

> **Correction (2026-09-27, #836).** This page used to describe the cap as volume the venue
> waives the taker fee on, and as *"the profitability boundary"*. That was wrong for keel's
> orders. On 2026-09-27 the account's own `get_transaction_summary` reported
> the **Intro** tier (0.9% taker, 0.5% maker) with `has_promo_fee: false`, and every live fill
> had paid a fee. Coinbase One's "zero trading fees up to $500/month" applies on the main
> Coinbase platform, not Advanced Trade, where the listed Coinbase One benefit is a fee
> rebate. The rail's mechanism and every number it enforces are unchanged; only the claim
> about fees was removed. Research that modelled an "inside the allowance, fee-free" regime
> carries a dated note saying that regime is hypothetical for keel's orders.

## Where the setting lives — the database, not config.yaml

Expand All @@ -32,7 +34,7 @@ on every order, so a new attestation takes effect on the very next one, with no
# Assert which tier the venue is on (the normal path; upgrades exactly one number)
keel subscription attest --venue <venue> --tier <tier>

# Escape hatch: a raw allowance without naming a tier (recorded as tier=unknown)
# Escape hatch: a raw monthly buy cap without naming a tier (recorded as tier=unknown)
keel subscription set --venue <venue> --free-volume-usd 500
```

Expand Down
Loading
Loading