diff --git a/docs/reports/2026-08-16-status-review.html b/docs/reports/2026-08-16-status-review.html new file mode 100644 index 00000000..cb68ac0c --- /dev/null +++ b/docs/reports/2026-08-16-status-review.html @@ -0,0 +1,445 @@ +Keel Status Review + + +
+
+

Status Review16 August 2026v0.7.1Coinbase spot

+

Keel: the instrument works, the strategies don't

+

Keel is a Shariah-screened spot crypto trading agent. It is built, tested, deployed and trading live. After exhaustive measurement, none of the strategies it runs has a positive edge net of cost — and establishing that, rather than hiding it, is the project's main result to date.

+
+
+ +
+
+
0.7.1Version · 18 releases
+
2,762Tests passing
+
19Guard rails
+
1Live order, ever
+
0 / 20Rules with net edge
+
+
+ +
+ +
+

Where it stands

+

Deployed, autonomous, and deliberately tiny

+

Keel runs unattended on a daily cycle, places real orders against real funds, and is capped so that being wrong costs a few dollars rather than a portfolio.

+ +
+ + + + + + + + + + + +
Live deployment · sandbox scale
ItemStateFigure
ModeAutonomous, one cycle per UTC day Live01:20 UTC
AllowlistBTC, ETH, PAXG, ADA, XLM, DOGE6
Active rules5 × turtle breakout, 1 × DCA, 1 × DOGE turtle7
Open positionBTC-USD, opened by the DCA rule1
Account scaleSandbox — sized so that being wrong costs a few dollarswithheld
Position capsTotal exposure and per-order, both rail-enforcedwithheld
+
+ +

A parallel paper deployment carries a wider universe — 19 allowlisted assets, 20 attested, 22 rules — and exists purely to accumulate evidence without risking funds.

+
+ +
+

Orders

+

One order in the system's lifetime, and we can say exactly why

+

Keel has placed one live order. That number is a feature of the design, not a defect in it — every buy must clear nineteen independent rails, and most candidate trades never do.

+ +
+ + + + + + + + + + + +
The only live order
FieldValue
PlacedAugust 2026
InstrumentBTC-USD
Side / typeBUY, market order
Ruledca — scheduled accumulation, not a signal trade
StatusFilled; position still open, marked modestly negative
Sizes and fillsWithheld — see note below
+
+ +

Account balances, position sizes, fill prices and exact order times are withheld from this committed copy. This repository is public; those figures are personal account state, and nothing in the analysis depends on them.

+ +

Why only one

+

The DCA rule is the only one currently able to fire: it is exempt from the risk breakers that gate signal rules, and it never exits, so it accumulates rather than round-trips. Every turtle-breakout signal since has been either no setup or vetoed at the rails. Most recently a valid DCA signal on 2026-08-14 was vetoed by rail 17 because the withdrawal-capability attestation had expired — the system refused to buy an asset it could not prove it was able to withdraw.

+
+ +
+

The central result

+

Cost, not signal, is the binding constraint

+ +
+

Across the entire universe, no configuration is simultaneously measurable and profitable

+

Round-trip friction is ~2.5% of notional (1.2% taker per leg plus slippage). That is the same order of magnitude as the per-trade edge of everything measured — so the edge is real but the toll eats it.

+
    +
  • Hourly bars19 of 20 rules reach a measurable sample (median n=268). Zero are net-positive.
  • +
  • Daily bars — 6 of 20 look net-positive, but zero reach n≥100 (max n=18). Not one is promotable.
  • +
  • The daily table is noise. Rank correlation between daily and hourly results is ρ = −0.009 — none. At n≈12 the ranking carries no information about n≈268.
  • +
+
+ +

What was measured

+
+
+

Grids swept. An 864-trial turtle-breakout parameter sweep across six assets; a 90-cell shipped-defaults intersection across all 24 assets with hourly history; an 82-cell RSI mean-reversion frequency grid. All re-run on a corrected engine.

+
+
+

Asset expansion is refuted as a performance fix. Turtle breakout is negative on all 24 assets measured, so a 25th cannot rescue it. New assets are justified on statistical power and the compliance pipeline — never on hoped-for returns.

+
+
+ +

Two engine defects that produced believable numbers

+

Two pairs of bugs — a pending setup that never expired, and entries filling at a touched limit price rather than the next open — produced plausible, internally consistent results for the life of the project while 2,712 tests passed. On restatement, trade counts rose in 87 of 90 cells and profit factors fell in 69 of 90. Every performance figure predating the fix was void. Plausible output is not evidence of a working engine.

+ +

An independent, executed measurement (Frankfurt School, 432 real round-trips, Jan–Feb 2026) puts retail crypto round-trip costs at 0.53%–6.45% depending on venue. Our ~2.5% model sits mid-range — not pessimistic.

+
+ +
+

Rules & strategies

+

Four registered rule kinds, closed by design

+

The rule registry is deliberately closed: a new strategy is a reviewed change to the trading core, not something a research process can introduce on its own.

+ +
+ + + + + + + + + +
The shipped library and how each fails
RuleShapeMeasured verdict
turtle_breakoutDonchian breakout, ADX-gated, ATR stopReal, broad gross edge — destroyed by cost
rsi_meanrevOversold bounce at supportBest gross distribution — never fires enough to be measured
pullback_continuationTrend pullback to EMA bandEssentially no edge (median gross 0.77)
dcaScheduled accumulation, never exitsNo edge claim — Live the only rule trading
+
+ +

Three unrelated failure modes is itself the finding — this is not one broken idea, it is three separate ones failing for three separate reasons, which is what makes the cost explanation credible rather than convenient.

+ +

A structural asymmetry worth knowing

+

Fees are purely proportional — there is no fixed per-order component. So splitting a given sum across more trades costs exactly the same. "Trade less" helps a round-trip rule, where each completed trade must clear a ~2.5% toll; it does nothing for an accumulation rule that never exits. DCA pays roughly half the friction of a signal rule because it defers the exit leg indefinitely, not because it trades rarely.

+
+ +
+

Compliance

+

Nineteen rails, and unknown always means no

+

Keel is a Shariah-screened system. Sector, backing and yield cannot be derived from price data, so an unclassified asset is unknown — and unknown is a rejection, never a default pass. Twenty assets carry human attestations; each also needs a separate attestation of what contract the venue listing actually is, because a CFD can spell itself exactly like spot.

+ +
+
+

Representative rails

+
    +
  • Rail 1 — allowlist, enforced per trade
  • +
  • Rails 11 / 16 — drawdown and consecutive-loss breakers, entries only
  • +
  • Rail 17 — withdrawal capability (§65.4 qabd): an asset that cannot be withdrawn may not be validly possessed, so acquiring more of it stops
  • +
  • Rails 18 / 19 — USD-settled spot only; every other contract class is refused mechanically
  • +
+
+
+

The governing asymmetry

+

An automated process may reduce risk directly, but may only increase activity — a new asset, a new rule, a buy — by passing a deterministic gate a human built and reviews. Attestation and admission remain human decisions by construction, and the CLI enforces it: releasing a rail-17 halt demands a typed confirmation at a terminal, specifically so a scheduled job cannot do it.

+
+
+
+ +
+

Asset sweep

+

The scout found more bugs in itself than assets to trade

+

An automated scout sweeps ~920 Coinbase USD listings, screens them, and proposes candidates for human attestation. Fourteen runs to date. Its most valuable output has been three defects in the discovery pipeline itself, each of which silently hid assets the admission gate would have accepted.

+ +
+ + + + + + + + +
Discovery estimators vs the criteria they stood in for
EstimatorFailureVisibility
24h volume pre-filterDropped assets before emissionSilent — no output at all
--probe-liquidityUnderstated the real figure by 4.45×Visible but misleading
--probe-history±30-day approximation of a hard bar countBenign false positive
+
+ +

On a single quiet trading day, five admissible assets vanished from the sweep — their true liquidity sitting at 3.08× to 6.32× the admission floor. One was the scout's own shortlisted candidate. All three defects are now fixed: the pre-filter no longer shares a threshold with a statistic it isn't comparable to, exclusions are reported with per-reason counts, and truncation is stated rather than silent.

+
+ +
+

Venues

+

Coinbase spot only — and the refusals are structural

+

Three venue expansions were studied and three answered no. Two are permanent; one is "not yet".

+ +
+ + + + + + + + + +
Venue feasibility studies · August 2026
VenueVerdictWhy
cTrader Open APIRefusedEvery account it can express is a leveraged, short-permitting CFD. There is no message in the protocol for an unleveraged spot holding.
Trade NationRefusedNothing in the product range is spot ownership — CFDs and spread bets throughout.
US equitiesNot yetCoinbase does have an equities order path — the brief was wrong. But market data is absent: n=0 candles across 21 trading days, preview refused 403, three conflicts with our execution model.
Coinbase futures / perpsRefusedRails 18/19 reject any non-USD-settled-spot contract mechanically, regardless of narrative.
+
+ +

The distinction matters for planning: a CFD venue is never, because the instrument conflicts with the charter. Equities are not yet, because the blocker is data and execution capability, both of which can change.

+
+ +
+

Engineering

+

Refactoring, typing, and versions that can prove what they are

+ +
+
+

Workspace split

+

The monolith became six distributions — keel-core, a broker port (keel-broker-api), and three adapters (coinbase, fake, robinhood) behind it. Adding a venue is now an adapter, not surgery on the core.

+ +

Type safety, made real

+

mypy strict is scoped to the brokers, with keel.* genuinely checked rather than nominally — it had been silently on an ignore list. py.typed now ships with all four broker distributions, and CI gates on mypy so the ungating cannot quietly come undone.

+
+
+

Versioning

+

Eighteen releases, v0.5.0 → v0.7.1. Releases are manual-only and re-run lint, types and the full suite before building — a red main cannot become a wheel.

+

Each build stamps its own version and commit, so an installed artifact identifies itself with no git present: keel 0.7.1+02bc86d90b67 [release]. A separate keel versions command cross-checks that every keel distribution in the environment agrees — added after a deployment silently ran keel-trader 0.5.7 against keel-core 0.5.5.

+
+
+ +

This week

+

Six pull requests merged. Two fixed live production defects: a catch-up request that exceeded the venue's 350-candle cap and self-wedged — the gap grew daily, so it could never recover — and a discovery filter that hid admissible assets. Both were verified against real production data, not only tests. Four more closed review findings, including one where a change had removed the only test pinning the admission liquidity floor: the floor could have been cut 5× with a fully green suite.

+
+ +
+

Roadmap

+

What's next, in the order it matters

+ +
+
+ #260Honour a rule's conditional entry price Highest value + The executor discards the entry level a rule computed and routes a market order. This is not cosmetic: it doubled pullback_continuation's trade count and dropped its gross profit factor from 0.92 to 0.77 — the strategy takes trades it was designed to decline. +
+
+ #259Per-asset slippage + One global 5bp constant is applied from BTC to the thinnest listing, so illiquid assets are credited with execution they cannot achieve — always in the favourable direction, by an unmeasured amount. +
+
+ #233Capability-based venue visibility + A read-only API key currently looks identical to a working one until an order fails. +
+
+ #198Robinhood prerequisites + The adapter exists behind the broker port; the live execution path is deliberately not wired until its preconditions are met. +
+
+ +

The open strategic question

+

Every reachable configuration has now been measured and none is viable at this venue's cost. That leaves three honest directions, and they are not equivalent:

+ +

The turnover-reduction literature — the most promising family — was chased to its primary source this week and closed: its best-evidenced technique has already been swept in our own grids and produced nothing.

+
+ + + +