docs: record the live-seeded rules as a deliberate, bounded standing exception - #187
Merged
Merged
Conversation
…exception
keel-live.db rules 1-5 (turtle_breakout on BTC/ETH/PAXG/ADA/XLM) have carried status=live with
promoted_at NULL since 2026-07-24, against `rules seed`'s own printed instruction: "Do not leave
live-seeded rules in place afterwards." Reviewed 2026-08-08; kept deliberately; recorded here
rather than left silent.
This applies the standard the project already set for PAXG in
docs/experiments/2026-07-20-allowlist-screen-first-run.md -- "The one thing not to do is leave it
silently exempt because it was already there." The exception was already load-bearing; it just
wasn't written down anywhere.
WHY KEEP THEM. min_trades is 100 PER RULE and this strategy cannot reach it. Measured by
backtesting each rule over ~5.02 years of daily bars:
BTC 13 trades = 2.59/yr -> ~39 years to 100
ETH 13 trades = 2.59/yr -> ~39 years
XLM 8 trades = 1.59/yr -> ~63 years
ADA 6 trades = 1.19/yr -> ~84 years
PAXG 4 trades = 3.20/yr -> ~31 years
Waiting for the gate is not a slower path to the same place, it is no path. The sandbox exists to
accumulate the live evidence the gate demands and cannot itself produce; demoting these rules
would end that experiment without substituting anything for it.
WHAT BOUNDS THE RISK, since the gate did not: the caps (max_exposure_usd 200 total at once,
max_per_order_usd 100), the eighteen un-overridable guards.py rails, rail 1's allowlist, and rail
14's monthly allowance. The bypass is of the EVIDENCE gate, not the SAFETY rails -- separate
mechanisms, and only the first was skipped.
Explicitly NOT a precedent for admitting assets, not a reason to raise caps, and not a claim these
rules are validated -- no walk-forward or PBO run has ever covered ADA or XLM, and none of the
five clears any promotion axis.
Named revisit triggers rather than an open-ended pass: caps rising above this sandbox's
few-dollars-of-damage scale, the rule set changing, a rule trading materially more often than the
table above, or the sandbox being treated as evidence for anything beyond itself.
Recorded in two places an operator actually reads: a block in config.live-sandbox.yaml beside the
allowlist it applies to, and a new "Standing exception" subsection under go-live-runbook.md's §3,
which previously documented the ACT of short-circuiting the gate but not the ongoing STATE.
Comment/docs only. load_config yields an identical allowlist, caps and weights; comment-stripped
diff against main is empty; 2078 tests pass. No database written, no rule status changed.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
keel-live.dbrules 1–5 (turtle_breakouton BTC/ETH/PAXG/ADA/XLM) have carriedstatus = livewithpromoted_at IS NULLsince 2026-07-24 — againstrules seed's own printed instruction:Reviewed 2026-08-08. Kept deliberately. Now recorded rather than silent.
This applies the standard the project already set for PAXG in
docs/experiments/2026-07-20-allowlist-screen-first-run.md:The exception was already load-bearing — it just wasn't written down anywhere.
Why keep them
min_tradesis 100 per rule, and this strategy cannot reach it. Measured by backtesting each rule over ~5.02 years of daily bars:Waiting for the gate is not a slower route to the same destination — it is no route. The sandbox exists to accumulate the live evidence the promotion gate demands and cannot itself generate. Demoting these rules would end that experiment without putting anything in its place.
What bounds the risk, since the gate didn't
The caps (
max_exposure_usd200 total at once,max_per_order_usd100), the eighteen un-overridableguards.pyrails, rail 1's allowlist, and rail 14's monthly allowance.The bypass is of the evidence gate, not the safety rails — separate mechanisms, and only the first was skipped.
What it is not
Not a precedent for admitting assets. Not a reason to raise caps. Not a claim these rules are validated — no walk-forward or PBO run has ever covered ADA or XLM, and none of the five clears any promotion axis (see #185).
Revisit triggers
Named, rather than an open-ended pass: caps rising above this sandbox's few-dollars-of-damage scale; the rule set changing; a rule trading materially more often than the table above; or the sandbox being treated as evidence for anything beyond itself.
Where it's recorded
Two places an operator actually reads:
config.live-sandbox.yaml— a block beside the allowlist it applies to.docs/go-live-runbook.md§3 — a new "Standing exception" subsection. §3 previously documented the act of short-circuiting the gate but not the ongoing state.Verification
load_configyields an identical allowlist, caps and weights; comment-stripped diff againstmainis empty.python -m pytest tests/ -q→ 2078 passed.🤖 Generated with Claude Code