docs(research): the Alpaca options venue reality, marked doc-only where it is (#636) - #753
Merged
Merged
Conversation
…re it is (#636) #636 asks six questions and forbids answering them from documentation alone -- #412's lesson, where Robinhood's order shapes were doc-only until a real order 403'd. This session holds no Alpaca credential, so EVERYTHING here is documentation, and every finding carries a mark saying so: [DOC], [DOC-GAP], [KEEL], [ARITH]. The document opens by stating it does not close the issue. THE QUESTION THAT MATTERS IS NOT ANSWERED ANYWHERE Alpaca offers no cash accounts -- "All accounts are set up as margin accounts" -- which keel already knows and already handles: `verify_cash_account` refuses any `multiplier` but 1, the posture an operator reaches via `max_margin_multiplier: 1`. Whether options approval SURVIVES that setting is documented nowhere. If enabling options forces the multiplier above 1, the adapter stops building at all and options become a destructive change to the equities trading that already ships. Per #636's own rules, an unanswerable question is a finding that weights toward holding the line. RAIL 19 ALREADY REFUSES AN OCC SYMBOL, AND SAYS WHY `SPY250127C00608000` has no hyphen, so `parse_spot_product_id` returns None and rail 19 vetoes -- in every mode, both sides, DCA included, deliberately outside `LIVE_STATE_RAILS` so paper cannot skip it. There is no config field to widen it and the comment says why: "Spot-only is this agent's CHARTER, not an operator preference." Options are not blocked by a missing feature; they are blocked by the rail that encodes the constitution. That sizes the ADR-0005 amendment exactly. THE VENUE DISPOSES OF INVENTORY BY ITSELF ITM contracts auto-exercise at $0.01, and where buying power is short, "Alpaca will sell-out the position within 1 hour before expiry". keel's premise everywhere is that nothing disposes of inventory but its own exit policy. Assignment, meanwhile, arrives by POLLING only -- "Options assignments are not delivered through websocket events" -- so it is also the first inventory event with no originating keel order. THE FEES ARE NEGLIGIBLE AND THAT IS THE TRAP Read from the fee schedule PDF revised six days ago, because an automated extraction of the same file reported OCC at $0.65 against an actual $0.025 -- the doc-only hazard reproducing itself inside this pass. Round trip is about $0.084/contract; a cash-secured put's opening leg is 4.6bp of premium. The real cost is the bid-ask spread, which no document states, and arguing an options ADR from the fee schedule would repeat precisely the error 2026-09-05-restatement-restated.md corrected for crypto. AND IT IS UNEXECUTABLE TODAY REGARDLESS A cash-secured put is collateralised at strike x 100 and cannot be fractionalised: $1,800 for the cheapest plausible underlying against `config.live.yaml`'s `budget_usd: 50`. Roughly 36x the deployment's clip, decidable without any jurisprudence. Paper accounts get Level 3 automatically, so the mechanical half is verifiable free -- but paper grants it to everyone, so it can never answer the account- posture question. The document says which half is which. Discovery only: no code, no rail change, no config. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KZZxmspQXe5qJ9FAsG13s6
6 tasks
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.
Discovery for #636. No code, no rail change, no config — one document under
docs/research/.It does not close #636, and says so first
#636 forbids deciding from documentation alone (#412's lesson). This session holds no Alpaca credential, so everything here is documentation, and every finding carries a mark:
[DOC]quoted from Alpaca,[DOC-GAP]unanswered,[KEEL]verified in this source tree,[ARITH]derived with the arithmetic shown.The five findings that matter
F1 — the load-bearing question is undocumented. Alpaca offers no cash accounts ("All accounts are set up as margin accounts"); keel already handles that with the
multiplier == 1proxy viamax_margin_multiplier. Whether options approval survives that setting is stated nowhere. If enabling options forces the multiplier above 1,verify_cash_accountraises and the adapter stops building — options would be a destructive change to the equities trading that already ships.F5 — rail 19 already refuses an OCC symbol, and says why.
SPY250127C00608000has no hyphen, soparse_spot_product_idreturnsNone. The rail runs in every mode, both sides, DCA included — deliberately outsideLIVE_STATE_RAILS, so paper cannot skip it: there is no rehearsal path. No config widens it, and the comment says "Spot-only is this agent's CHARTER, not an operator preference." Options aren't blocked by a missing feature; they're blocked by the rail that encodes the constitution. That sizes the amendment #637 is considering.F3 — the venue disposes of inventory by itself. ITM contracts auto-exercise at
$0.01, and where buying power is short, "Alpaca will sell-out the position within 1 hour before expiry." F2 — assignment arrives by polling only: "Options assignments are not delivered through websocket events." It is also the first inventory event with no originating keel order.F6 — the fees are negligible, and that is the trap. Round trip ≈
$0.084/contract; a cash-secured put's opening leg is 4.6 bp of premium. The real cost is the bid-ask spread, which no document states. Arguing this ADR from the fee schedule would repeat exactly the error2026-09-05-restatement-restated.mdcorrected for crypto — where the flat 5bp floor turned out to be 52.3bp median and the verdict went to0 of 240.F7 — unexecutable today regardless. A cash-secured put is collateralised at
strike × 100, unfractionalisable:$1,800for the cheapest plausible underlying againstconfig.live.yaml'sbudget_usd: 50. ~36× the deployment's clip — decidable with no jurisprudence at all.One note on method
The fee table is read from the PDF directly (schedule revised 2026-09-01) because an automated extraction of that same file reported OCC at
$0.65against an actual$0.025. The doc-only hazard #636 warns about reproduced itself inside this pass, so it's recorded in the document.What's left
Paper accounts get Level 3 automatically, so the mechanical half (F2's activity records, F4's multi-leg payload, real bid-ask on touchable strikes) is verifiable free and needs no options agreement. But paper grants Level 3 to everyone, so it can never answer F1 — that needs Alpaca support in writing, or a live application. The document marks which half is which.
🤖 Generated with Claude Code
https://claude.ai/code/session_01KZZxmspQXe5qJ9FAsG13s6