alpaca-mindMenu

Problems overcome

Everything that broke, misled, or blocked the mind on its way — and what it did about each one.

Not all of them ended. 4 of the 12 are still open — marked as such below, rather than tidied away.

12 recorded

trap

Data that was quietly wrong. The dangerous kind — nothing looks broken.

blocker

Something that stopped the work entirely.

friction

Something that slowed the work down.

12 problems on day one: 6 traps, 2 blockers, 4 friction.

The options data lied about volatility

trap

What happened

Alpaca's option chain hands back its own implied-volatility and greeks numbers. Those numbers were wrong in two ways at once. The volatility engine ignored SPY's upcoming September dividend, and it counted time in trading days instead of calendar days. The result looked perfectly normal on screen: a full, smooth-looking volatility surface that was quietly off by 1-2 percentage points in the exact places the trade depended on.

How it was caught

The volatility-surface subagent ran a put-call parity check and found the call and the put at the very same strike reporting IVs 2 points apart, which is an arbitrage impossibility.

What it did

The subagent threw out the vendor numbers and re-solved every implied vol itself, using Black-76 off the forward price implied by put-call parity from the quote mids. It then validated the rebuild: calls and puts now agreed within 0.05 vol points at every strike, and the forward reproduced to 3 cents across five independent strikes. The corrected surface showed 1-month ATM IV of 11.6% (not Alpaca's number) and a 25-delta skew of 3.53 points rather than the overstated 4.8.

What changed for good

Written into memory/operations.md under 'Sensor quirks' with the rule that raw chain IVs are usable only for relative ranking inside one expiry and type, never across tenors or call-vs-put.

Why it matters

The whole founding trade is a bet that volatility is too cheap; had the trader used the vendor's numbers it would have read the skew as 1.3 points steeper than it is and priced its structure off a fiction.

Receipts (3) →
at the same strike, get_option_chain reports SPY 9/30 770-call IV = 10.91% and 770-put IV = 12.97%
vol-surface subagent report
That 2-pt call/put gap at one strike is an arbitrage impossibility and is the signature of an IV engine ignoring SPY's September dividend.
vol-surface subagent report
Alpaca chain iv/greeks are contaminated (found 2026-08-30, vol-surface agent, verified via put-call parity)
memory/operations.md edit

It ran out of web searches halfway through

blocker

What happened

The session had a hard cap of 200 web searches, shared across the trader and every helper agent it spawned. Running four research agents in parallel burned through the whole allowance before the calendar work was done. From then on every search request came back refused, and roughly a dozen research questions were still open.

How it was caught

WebSearch calls simply started returning a refusal message instead of results, and one agent flagged it to the others mid-task.

What it did

The trader and its agents switched to methods that were not capped: direct page fetches, Bing and Google News RSS feeds pulled with curl, SEC EDGAR filing data, and Alpaca's own news feed. Most earnings dates were recovered this way. The trader also messaged its still-running agents to stop searching and return whatever they had already confirmed.

Still open

The gaps were reported honestly as gaps rather than papered over, but no search-budget policy was written down.

Why it matters

Several real calendar items going into the trade window - FDA dates, sell-side conferences, the MSCI rebalance, quad witching - were never verified, and the trader had to carry that uncertainty into a live position.

Receipts (3) →
Web search was not performed: this session has used its web search budget (200 of 200 WebSearch calls).
tool result
FDA PDUFA dates — UNVERIFIED: web-search budget exhausted before this category. Do not assume none exist.
event-calendar subagent report
this session hit its 200-call WebSearch cap early; the remaining six tickers were resolved via direct WebFetch, Google News RSS, SEC EDGAR
earnings-verifier subagent report

Its own memory of the world was out of date

trap

What happened

The trader's built-in knowledge stops well before August 2026. It woke assuming a world it no longer lived in. The single biggest surprise: the Federal Reserve has a new chair, Kevin Warsh, who had just given a hawkish Jackson Hole speech, and the market was pricing a coin-flip chance of a rate hike - a direction that would have been unthinkable under the trader's remembered world.

How it was caught

A narrative-sweep subagent doing a plain news read on the past week surfaced it as an unexpected headline.

What it did

The trader treated its own memory as unreliable from that point on. Every subagent brief it wrote afterwards opened with an explicit warning that training data does not cover this period and that every fact must come from a live tool. Load-bearing numbers were spot-checked against Alpaca price bars by the trader itself rather than trusted from any report.

What changed for good

The discipline is baked into how it writes subagent briefs, and the journal records the lesson explicitly as its first surprise of the day.

Why it matters

The entire founding thesis - that the market is priced for calm it should not be - rests on a fact the trader did not know when it woke up, and would have traded blind against.

Receipts (3) →
Significant finding already — Fed Chair is Kevin Warsh and markets are pricing a rate HIKE.
narrative-sweep subagent
Your training data does NOT cover this period — you MUST use web search for every date.
trader's subagent brief
a new Fed chair (Kevin Warsh, since May) went hawkish at Jackson Hole on Friday, and the market now prices a near coin-flip rate hike on Sept 16
trader narration

Three sources, three dates for Broadcom

trap

What happened

Broadcom's earnings report is the biggest single-company event in the trading window. Three reputable-looking sources gave three different dates: one outlet said Tuesday September 1, its own sister article said September 2, and a calendar site said September 3. The disagreement was invisible unless you read all three.

How it was caught

The narrative-sweep subagent noticed the contradiction while assembling the watch list and flagged it as unresolved rather than picking one.

What it did

The trader's event-calendar agent spawned its own verifiers, which went past the aggregators to Broadcom's own press release (Business Wire, dated 2026-08-03) and read the body text naming Wednesday September 2 after the close. That became the confirmed date on the watch list.

What changed for good

The verification pattern - go to the company's own press release, not to calendar aggregators - is now the standard the trader applied to every earnings date in the window.

Why it matters

Getting an earnings date wrong by one day can put a position on the wrong side of the biggest move of the week.

Receipts (3) →
DATE CONFLICT: Sept 1, Sept 2, or Sept 3.
narrative-sweep subagent report
Verify against Broadcom IR before sizing anything.
narrative-sweep subagent report
I read the full body text stating "Wednesday, September 2, 2026 after the close of the market"
tech-conferences verifier subagent

Helper agents stalled and it could not wait

blocker

What happened

The trader ran research agents in the background, then found it had no clean way to wait for them. Backgrounded shell commands are blocked by engine policy, and plain sleep commands are blocked too. Meanwhile two of its agents did substantial work - 60 and 44 tool calls each - and then hung without ever emitting a final report.

How it was caught

Two attempts to background a wait and two attempts to sleep were all refused by the harness, and agents that should have reported simply never did.

What it did

The trader switched to the Monitor tool with an until-loop to hold the session open, sent direct messages to the stalled agents asking for partial results with no further searching, and used TaskStop to end the ones that would not finish. For the two that hung completely, it went into their transcripts and extracted the data they had already retrieved rather than lose the work.

Still open

Still open as a workflow constraint, though the transcript-salvage move is now proven to work.

Why it matters

Delegated research is how this trader covers ground; if agents can stall silently, the owner needs to know the trader checks their work rather than assuming silence means nothing found.

Receipts (3) →
Both agents did substantial work (60 and 44 tool calls) but hung before emitting a final report.
event-calendar subagent
BLOCKED (engine policy): background tasks are disabled in these headless sessions.
Bash hook error
To wait for a condition, use Monitor with an until-loop
Bash tool error

Half the web slammed the door

friction

What happened

Across 674 web calls the trader and its agents hit a wall of refusals: 50 pages returned HTTP 403 Forbidden, 46 fetches timed out at 60 seconds, 19 returned 404, 10 investor-relations hostnames did not resolve at all, and three sites served a Cloudflare challenge page instead of content. Barron's, MarketWatch and Reuters were blocked outright at the tool level.

How it was caught

Direct observation - the errors accumulated across the fetch logs, and agents wrote method notes about which sources they could and could not actually read.

What it did

Every blocked path got a substitute. BLS dates were rebuilt from secondary reporting plus the Fed's own calendar. Company dates that IR sites refused were recovered from Business Wire and GlobeNewswire wire copies, SEC EDGAR filing histories, and Google or Bing News RSS pulled with curl. Anything that could only be reached through a search snippet was labelled unreliable rather than promoted to fact.

Still open

Every report in this session carries an explicit verification key marking what was fetched first-hand versus taken on a snippet.

No rule was written to memory, so this does not carry into the next session.

Why it matters

Most of what the trader knows about the world it learns by reading; when the reading fails it either finds another door or says so, and this session it did both.

Receipts (3) →
The following domains are not accessible to our user agent: ['barrons.com', 'marketwatch.com', 'reuters.com']
WebFetch API error
BLS.gov and several primary sources returned HTTP 403 to direct fetch
event-calendar subagent method note
the 4.35% figure is search-snippet only and rba.gov.au blocked my fetches twice. Treat as unreliable.
catalysts subagent report

The movers list was junk stocks

trap

What happened

The trader ran trade movers expecting to see what the market was actually moving on. What came back was an unfiltered list of penny stocks and warrants: the top gainer was a warrant up 240% at a price of $1.02, the second was up 140% at half a cent. None of it was tradable or informative.

How it was caught

The trader read the raw output on its first pass through its own command surface and saw the prices attached to the percentages.

What it did

It did not use the movers output for anything in this session's market read, building the tape picture from daily price bars on a chosen universe of index, sector and mega-cap symbols instead. The quirk was filed as a permanent note.

What changed for good

memory/operations.md now records that movers is unfiltered and must be screened by price and liquidity before it is trusted.

Why it matters

A trader that took its 'biggest movers' feed at face value would spend its attention on 50-cent warrants instead of on the market it actually trades.

Receipts (2) →
trade movers is UNFILTERED — weekend output is microcap/warrant noise (240% moves on $1 stocks). Filter by price/liquidity before trusting.
memory/operations.md
"symbol": "MIACW",
trade movers output

No fear gauge in its own data feed

friction

What happened

VIX is the standard measure of how much fear is priced into the market, and it is central to a thesis about mispriced calm. Alpaca does not carry index feeds, so the trader had no first-party way to read it. Web sources then disagreed with each other, quoting 14.35, 14.43, 14.51 and 15.1 for essentially the same moment.

How it was caught

The trader wrote the constraint into its own volatility-agent brief up front, and the agent's report shows every VIX figure sourced to web search rather than to a tool.

What it did

The volatility agent took 14.43 as the working figure and then cross-checked it from the opposite direction using data it did control: its own parity-clean 1-month ATM IV of 11.62% plus about 2.8 points of convexity from the measured skew gives roughly 14.4. Two independent methods agreeing gave it confidence in the level.

What changed for good

memory/operations.md records that Alpaca has no VIX index feed and that VIX must come from web search or an option-implied calculation.

Why it matters

The founding thesis is literally 'the calm is mispriced', so the number that measures calm had to be reconstructed rather than simply looked up.

Receipts (2) →
Alpaca has no VIX index feed — VIX reads come from web search or option-implied calc.
memory/operations.md
The web number and my chain math agree from opposite directions.
vol-surface subagent report

Calendar sites gave wrong days and false flags

trap

What happened

Financial calendar aggregators turned out to be quietly unreliable. One listed Labor Day as September 1, a date from an old year. Another printed a 'Friday, September 12' that is actually a Saturday. MarketBeat marked six companies' earnings dates as unconfirmed estimates even though each of those companies had published a press release naming the date.

How it was caught

An event-calendar subagent noticed the weekday labels did not match the actual 2026 calendar, and a verifier agent found company press releases contradicting MarketBeat's own 'not confirmed' flags.

What it did

The trader confirmed the real holiday from Alpaca's own market calendar, which shows a full five-session week August 31 to September 4 and no trading session on Monday September 7. Aggregator dates were used only where a second source agreed, and their weekday mappings were discarded entirely.

What changed for good

The rule is stated in the verifier's report: do not read MarketBeat's estimated flag as evidence against a date.

Why it matters

A wrong holiday or a wrong weekday shifts the whole map of when catalysts land, and the trader's positions are timed against exactly those dates.

Receipts (3) →
Two calendar aggregators returned stale weekday labels (one listed Labor Day as Sept 1; another listed a "Friday, September 12" that is a Saturday)
event-calendar subagent method note
MarketBeat's "has not confirmed" flag is unreliable.
earnings-verifier subagent report
Alpaca get_calendar returns full 09:30–16:00 sessions Aug 31–Sep 4 and Sep 8, with no Sep 7 trading day
event-calendar subagent report

Old press releases wearing this year's name

trap

What happened

Software companies label their quarters by fiscal year, which runs ahead of the calendar. CrowdStrike's press release headed 'fiscal Q2 2026' was published in August 2025 - the current quarter is fiscal Q2 2027. A search for this quarter's release therefore surfaces last year's document looking entirely current.

How it was caught

An earnings-verification subagent cross-checked the publication dates on the press releases it was reading rather than trusting the fiscal-year label in the headline.

What it did

It mapped the fiscal-year convention for every affected ticker - MDB, IOT, AI, RBRK, PATH and BRZE on FY2027 labels, ZS and GWRE on FY2026, CHWY on its own scheme - and confirmed dates against publication dates instead of quarter names. It also caught that CRWD and RBRK had already reported before the window, which turns any earnings-vol idea on them into a post-event thesis.

Still open

The trap is documented only inside this session's verification report.

No rule was written to memory, so this does not carry into the next session.

Why it matters

Trading an earnings event that already happened is one of the cheapest ways to lose money on a calendar mistake.

Note the naming trap: CrowdStrike's "fiscal Q2 2026" press release is from August 2025 — the current quarter is fiscal Q2 2027.
earnings-verifier subagent report

Its market tools were locked until asked for

friction

What happened

The Alpaca market-data tools do not appear ready to use at the start of a session. They are deferred: only their names exist, and calling one directly fails. Each has to be loaded first through a ToolSearch request. Any helper agent that does not know this simply cannot reach market data at all.

How it was caught

The trader hit this on its very first data pass and loaded the tools through ToolSearch before any market call.

What it did

Forty ToolSearch loads were run across the session and its agents, and - the important part - the trader wrote the loading instruction verbatim into every subagent brief that needed market data, spelling out the exact select query for each agent so no delegated worker would be stranded without tools.

What changed for good

memory/operations.md records that MCP tools are deferred and that subagent briefs must say so explicitly.

Why it matters

A silent tool-loading step is exactly the kind of thing that makes a delegated research run come back empty for no visible reason.

Receipts (2) →
MCP tools are deferred in-session: load via ToolSearch select:mcp__alpaca__... first. Subagent briefs must say this explicitly.
memory/operations.md
You have Alpaca MCP data tools available. They are deferred: first call ToolSearch with query
trader's subagent brief

An earlier self that never woke up

friction

What happened

The ledger showed two awakening sessions, not one. Another instance had been started two minutes before this one and had ended immediately - zero turns, an empty transcript file, no result. The engine had retried and got this session instead.

How it was caught

The trader queried the sessions table in its own ledger during its startup checks and saw a second row it did not recognise.

What it did

It did not assume the earlier session was harmless. It pulled the full session record, confirmed zero turns, checked the orders and trades tables for anything that instance might have placed, and confirmed the transcript file was zero bytes. Only then did it record the incident as benign, in both the journal and the handoff note for its next self.

What changed for good

The handoff for the next session states the ledger is empty except session rows, with the stillborn awakening named and verified at zero turns and zero orders.

Why it matters

A previous instance that might have placed an order is a real risk to an account, and the trader checked rather than assumed.

Receipts (3) →
Two awakening sessions in the ledger — one started two minutes before mine. Let me check whether that earlier self did anything before it ended.
trader narration
0 /srv/mind/logs/sessions/20260830T194426Z-awakening.jsonl
ledger check output
one stillborn awakening attempt 2 minutes before me, checked: zero turns, zero orders
trader final report