You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 2e5219b
Browse filesBrowse the repository at this point in the historyBrowse files
while the classification keel reads lives on the account object itself, and the venue
690
+
implies but does not document the linkage between the two.
691
+
692
+
The posture is one system with the rest of the engine's constraints — where each piece
693
+
lives:
694
+
695
+
| Constraint | Where it lives | Why there |
696
+
| --- | --- | --- |
697
+
| No margin borrowing (riba) |**Enforced in code**: `verify_cash_account` at broker build refuses any multiplier ≠ 1, fail-closed on unreadable | The venue reports the classification; refusing at build covers every path before one sees a broker |
698
+
| Cash-only declared |`BrokerCapabilities.cash_only` — every adapter declares it, `keel brokers list` shows "cash only" | The port's declaration seam: vocabulary for the day an adapter announces a borrowing path |
699
+
| Long-only, no shorting |**Enforced in code**, pre-existing: `Setup.direction` is `Literal["long"]` (a short entry cannot be constructed), exits only close held longs, rails 18/19 refuse non-spot shapes in every mode | Not new in #372 — cited so the posture reads as one system, not three |
700
+
| T+1 settlement churn |**Documented** (the section above): settlement is venue-side; keel surfaces the spendable figure and rail 13 spends only that | Nothing keel can enforce about when the venue settles |
701
+
| PDT $25k threshold |**Documented** (this section): keel's CADENCE — one evaluation per session bar, holds overnight by construction — is the PDT safety; the posture claims no exemption (at multiplier 1 the account remains a margin account under PDT rules) | The safety is the cadence, not the posture; there is no separate rule to enforce |
702
+
| Stock lending / cash sweep OFF |**Operator-verified** (the section below) | No order is placed; no rail can see account settings |
`CashAccountRequired` (margin borrowing is riba — the posture's whole claim: it sidesteps
26
+
nothing on PDT, where the cadence, not the posture, is the safety; the refusal says so and
27
+
names the fix — set the account's max margin multiplier to 1), and a classification that
28
+
cannot be read at all raises the same
29
+
fail-closed refusal, cause chained and folded into the message. The declared half is
30
+
`BrokerCapabilities.cash_only=True`, rendered as "cash only" in `keel brokers list`. The
31
+
operator-facing walk (including the T+1 settlement and opt-out obligations) is the
32
+
runbook's "Account posture" and "T+1 settlement" sections.
33
+
17
34
## What works
18
35
19
36
| Capability | Detail |
@@ -25,6 +42,7 @@ there is no configuration path from a paper credential to
25
42
| Order status |`get_order` maps Alpaca's status enum to the port's vocabulary; unknown statuses stay `PENDING`. |
26
43
| Cancel | 204 from `DELETE /v2/orders/{id}` is the venue confirmation; 404/422 and any transport failure answer `False`. |
27
44
| Session |`is_market_open()` reads the venue's clock (`/v2/clock`) — no local calendar. |
45
+
| Posture |`verify_cash_account()` at broker build: `/v2/account`'s `multiplier` must be the cash classification (1); margin (2/4) and unreadable answers refuse, fail-closed (#372). |
28
46
| Rate limits | 429 retried with `Retry-After` when sent, exponential backoff otherwise, bounded attempt budget (FR-11). |
0 commit comments