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 @@ +
Status Review16 August 2026v0.7.1Coinbase spot
+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.
+Where it stands
+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.
+ +| Item | State | Figure |
|---|---|---|
| Mode | Autonomous, one cycle per UTC day Live | 01:20 UTC |
| Allowlist | BTC, ETH, PAXG, ADA, XLM, DOGE | 6 |
| Active rules | 5 × turtle breakout, 1 × DCA, 1 × DOGE turtle | 7 |
| Open position | BTC-USD, opened by the DCA rule | 1 |
| Account scale | Sandbox — sized so that being wrong costs a few dollars | withheld |
| Position caps | Total exposure and per-order, both rail-enforced | withheld |
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
+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.
+ +| Field | Value |
|---|---|
| Placed | August 2026 |
| Instrument | BTC-USD |
| Side / type | BUY, market order |
| Rule | dca — scheduled accumulation, not a signal trade |
| Status | Filled; position still open, marked modestly negative |
| Sizes and fills | Withheld — 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.
+ +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
+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.
+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 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
+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.
+ +| Rule | Shape | Measured verdict |
|---|---|---|
turtle_breakout | Donchian breakout, ADX-gated, ATR stop | Real, broad gross edge — destroyed by cost |
rsi_meanrev | Oversold bounce at support | Best gross distribution — never fires enough to be measured |
pullback_continuation | Trend pullback to EMA band | Essentially no edge (median gross 0.77) |
dca | Scheduled accumulation, never exits | No 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.
+ +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
+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.
+ +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
+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.
+ +| Estimator | Failure | Visibility |
|---|---|---|
| 24h volume pre-filter | Dropped assets before emission | Silent — no output at all |
--probe-liquidity | Understated the real figure by 4.45× | Visible but misleading |
--probe-history | ±30-day approximation of a hard bar count | Benign 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
+Three venue expansions were studied and three answered no. Two are permanent; one is "not yet".
+ +| Venue | Verdict | Why |
|---|---|---|
| cTrader Open API | Refused | Every account it can express is a leveraged, short-permitting CFD. There is no message in the protocol for an unleveraged spot holding. |
| Trade Nation | Refused | Nothing in the product range is spot ownership — CFDs and spread bets throughout. |
| US equities | Not yet | Coinbase 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 / perps | Refused | Rails 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
+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.
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.
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.
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
+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.
+ 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.
+