Skip to content

Record the BTC DCA rule as live in the deployment manifest - #162

Merged
eaitbrahim merged 1 commit into
mainfrom
chore/dca-live-manifest
Aug 3, 2026
Merged

Record the BTC DCA rule as live in the deployment manifest#162
eaitbrahim merged 1 commit into
mainfrom
chore/dca-live-manifest

Conversation

@eaitbrahim

Copy link
Copy Markdown
Contributor

One-line manifest change, regenerated from keel-live.db rather than hand-edited:

       "kind": "dca",
-      "status": "candidate",
+      "status": "live",

Rule 6 (dca, BTC-USD, budget_usd: 25, weekly cadence) was promoted candidate -> paper -> live on 2026-08-03.

Why it needed --force, twice

A DCA rule has no stop and no target. backtest() opens a position that never closes, so every trade stays open, the aggregates exclude it, and the promotion gate sees n_trades=0 against min_trades: 100. It cannot clear the floor — not with more history, not ever. That is the structural case promote --force documents, now also written down in the go-live runbook.

(It also needs --granularity ONE_DAY on the gated path, because Dca never sets self.granularity the way TurtleBreakout does. Moot under --force, which skips the backtest.)

Why this file matters

budget_usd: "25" is the entire point of the manifest. keel init on a rebuilt box seeds from constructor defaults and would bring the rule back at 50, unpromoted — twice the money, on a machine that otherwise looks correctly provisioned.

Context

This is keel's first live rule that fires on a schedule rather than on a market setup. The five turtles have been live since go-live and have never signalled once: price has sat 3–27% below the 40-day Donchian entry on every product, closest being PAXG at 3.09%.

Rail 17 (withdrawal capability) was attested --enabled the same day, and that is what actually unblocked BUYs. It had been failing closed since go-live and would have vetoed the first turtle breakout too — the rails had simply never been exercised against a real signal. That attestation expires after 7 days and is deliberately not automatable, so it is account state, not repo state, and does not belong in this file.

First order fires on the next cadence boundary, Thu 2026-08-06, and only at a terminal — the launchd job runs headless in confirm mode and fails closed without a TTY.

🤖 Generated with Claude Code

Rule 6 (`dca`, BTC-USD, `budget_usd: 25`, weekly) was promoted candidate -> paper -> live on
2026-08-03, with `--force` at both steps: a DCA rule has no stop and no target, so `backtest()`
opens a position that never closes and the promotion gate only ever sees `n_trades=0` against
`min_trades: 100`. It can never clear the floor on its own.

This is keel's first live rule that fires on a schedule rather than on a market setup -- the
five turtles have been live since go-live and have never once signalled, because price has sat
3-27% under the 40-day Donchian entry on every product.

Manifest regenerated from keel-live.db, not hand-edited. The `budget_usd: "25"` this records is
the whole point of the file: `keel init` on a fresh box would seed the constructor default of
50 instead.

Rail 17 (withdrawal capability) was attested `--enabled` the same day, which is what actually
unblocked BUYs -- it had been failing closed since go-live and would have vetoed a turtle
breakout too, not just this. That attestation expires after 7 days and is deliberately not
automatable, so it does not live in this file.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@eaitbrahim eaitbrahim added the tooling Dev/release tooling (Docs, CI & tooling) label Aug 3, 2026
@eaitbrahim
eaitbrahim merged commit ba8705a into main Aug 3, 2026
1 check passed
@eaitbrahim
eaitbrahim deleted the chore/dca-live-manifest branch August 3, 2026 23:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

tooling Dev/release tooling (Docs, CI & tooling)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant