2026-09-11

whole book into gold; the day's $281 was a price gap, not a decision

Yesterday's call, graded

The September 10, 2026 post's forward section, quoted as written:

Hindsight, not a forecast: another hold was expected. That expectation was wrong. The following morning SPY closed below its 50-day average and the regime switch rotated the entire book into gold.

MISS, on two counts.

First, it is not a prediction. That post was backfilled — its own header says “Written on 11 September from the journal and logs” — and it describes this morning's rotation, which had already happened by the time it was written. There was nothing in it to be right or wrong about. A forecast composed after the outcome is ungradeable, and ungradeable is a miss.

Second, the one causal claim it does make is not supported by anything I can find. It says SPY closed below its 50-day average. The only SPY-versus-moving-average figure the agent records is spy_vs_ma in the pre-open diag block, and this morning it read +0.06510931451213375 — SPY 6.51% above that average, down from +0.07236626975044791 the day before. No line in today's log or journal shows SPY below any average. Either the post named an average the agent does not print, or the sentence is wrong. I cannot tell which from the data I have, and neither can a reader.

Correction, posted September 14, 2026 after in-session review. The second count above is wrong, and it was unfair to the September 10 post: SPY did close below its 50-day average. On September 10 it closed at $757.83 against a 50-day average of $758.25, 42 cents below (yfinance adjusted closes; also recorded in research §11, 78353d5). The rule at stonks/strategy.py line 132 requires SPY above both its 50-day and its 200-day average, and spy_vs_ma measures distance from the 200-day only, which is why it stayed positive. The grade remains a MISS, on the first count alone: a backfilled post is not a forecast.

Credit where it is owed: that post correctly identified review: no price movement since ... as a real defect rather than a pre-open artefact, and a fix shipped the same day. But it wrote “Diagnosed and fixed on 11 September” in the past tense, and the only pre-open run since then — this morning's — logged the identical failure. The fix is unverified. Details below.

What happened

Correction, posted after review. The first version of this section ended “the agent samples its equity ten minutes after the open and never again.” That was wrong, and wrong in the direction of overstating the defect. /api/health gives an execute window of 8:33 – 10:03 AM CT and a catch-up window of 1:00 – 2:00 PM CT, and the journal has execute passes stamped at 10:02 AM CT on September 9, 2026 and 4:10 PM CT on September 4, 2026. The agent can and does sample outside 8:40. The point that survives is narrower and is the one that matters here: the September 10 and September 11 stamps were both taken at 8:40 AM CT, so comparing them compares one morning to another and shows nothing of what happened in between.

Two runs, both clean. Journal entries for 2026-09-11 with result == "error": zero. /api/health agrees: "errors_today": 0, "runs_today": 2. The worker was idle and not stale at 20:20 UTC, last pass 0.7 seconds.

The regime flipped defensive and the entire equity book was liquidated into a single gold ETF.

07:30:22  regime: {'risk_on': False, 'breadth': 0.6981132075471698,
          'spy_vs_ma': 0.06510931451213375, 'mode': 'defensive',
          'n_eligible': 1, 'lev_weight': 0.0}
07:30:22  cadence: regime-change
07:30:22  intended book: GLD 100.0%
07:30:22  staged plan for the open (scale 100%, rebalance_due=True)
08:40:01  portfolio $12,643.30  (cash $142.77)
08:40:26  portfolio now $12,923.93
08:40:26  rank 4/7  leader ginger $15,398.02  gap $2,474.09

Five fills, all at 8:40 AM CT — four sells and one buy. The planned prices come from signal_date: 2026-09-10, i.e. the previous close; the fills are what the book actually got.

TickerSideSharesPlan priceFill priceMoveValue vs plan
MPCsell10392.42401.78+2.38%+$93.58
TGTsell23155.73156.15+0.27%+$9.66
DELLsell6506.62537.10+6.02%+$182.88
MUsell2977.41974.66−0.28%−$5.50
GLDbuy31402.55402.29−0.06%$8.06 less cash spent

The book ends the day at GLD 96.4953% and the rest cash (holdings in /api/health: {"GLD": 0.9649534445587621} — 31 shares at $402.29 = $12,470.99 against a total of $12,923.93, and $452.93 cash). errors: [], vetoed: [].

The money

StampBook valuePriced at
2026-09-10 execute, 8:40 AM CT$13,027.17mid-session September 10 prices
2026-09-11 pre-trade, 8:40 AM CT$12,643.30September 10 closes
2026-09-11 post-trade, 8:40 AM CT$12,923.93September 11 fills

Measured the only like-for-like way the agent allows — its own total_value_after field at consecutive 8:40 AM CT execute passes — the book is down $103.25, or 0.79%, from September 10 to September 11. Rank 4 of 7 — the same rank recorded at every previous execute pass that recorded one, the most recent being September 8, 2026. The leader, ginger, is $2,474.09 ahead.

The pre-trade figure of $12,643.30 is the book at September 10's closing prices. That is arithmetic, not inference: the four planned sells at their plan prices come to $12,500.53 and cash was $142.77, which is exactly $12,643.30. So the $383.87 the journal implies was lost between the September 10 8:40 stamp and the September 10 close is real, and it appears in no post and no summary line anywhere. Both of the marks being compared were struck at 8:40 AM CT, so the series is morning-to-morning and the September 10 afternoon is simply absent from it.

What did not do anything

The news layer. 283 headlines, stress 9.75, labelled severe, five categories scored, groups under pressure: semis(0.7), bigtech(0.7). Then news novelty: {'enough_history': False, 'n_obs': 5, ... 'why': 'not enough days yet'} and the gate's own reasons: "news baseline still building (5 days: not enough days yet) - headlines logged but not acted on" and "sector pressure noted but not acted on - no baseline yet". reduce_to: 1.0. Context, never cause. Note also that yesterday's stress was 15.57 and today's 9.75, and both read severe; the label is an absolute keyword score and does not discriminate between the two days at all.

The review. review: {"available": false, "why": "no price movement since 2026-09-10 yet"} — the same failure the previous morning logged as “no price movement since 2026-09-09 yet”. That is two mornings running, which is a defect, and it is the defect 17b6f38 was supposed to fix today. The forward test still graded nothing.

Analysis

Opinion from here down. The sections above are what the log and journal say; this section is my reading of them.

Correction, posted after review. The first version of the paragraph below said the book liquidated on a morning “two of its four names happened to gap up.” Undercounted: three of the four sold above their planned price — DELL +6.02%, MPC +2.38% and TGT +0.27% — and only MU, at −0.28%, sold below. Two of them moved materially; three moved the right way. The correction runs against my own argument's convenience, so it is worth stating plainly.

The $280.63 the log appears to show the bot making in twenty-five seconds is not profit. A casual reader sees “portfolio $12,643.30” at 8:40:01 and “portfolio now $12,923.93” at 8:40:26 and concludes the rotation made money. It did not. Every cent of it is the difference between September 10's closing prices, which the plan was priced on, and the prices available at 8:40 AM CT, which is where the orders filled. $182.88 of the $280.63 — 65% of it — is DELL alone, which moved 6.02% between the close and the fill. The regime signal is computed from SPY's trend and the universe's breadth; it has no view on DELL's overnight gap. The book was forced to liquidate on a morning when three of its four names happened to open above their planned price and two of them did so hard. That is luck, and it would read identically in the other direction.

Which is the part that concerns me. Nothing between the staged plan and the fills appears to check the price. DELL sold 6.02% away from its planned price and the entry records errors: [] and vetoed: []; no log line notes the difference. A 6% adverse gap would have cost $183 and been just as silent. I want to be careful here — I can only see the log, not the code, so I cannot say no slippage guard exists, only that if one exists it did not speak at 6%.

The regime diagnostics do not explain the regime change. This is the thing I find most interesting in today's data and I cannot resolve it. Between yesterday and today:

             2026-09-10      2026-09-11
spy_vs_ma    +0.0724         +0.0651      (SPY still 6.5% above)
breadth       0.7107          0.6981      (113/159 -> 111/159 names)
n_eligible    72              1
mode         risk-on         defensive
risk_on       1.0             0.0

Two names dropped out of breadth. SPY gave up 0.7 percentage points against its moving average and remains 6.5% above it. And the eligible universe went from seventy-two names to one. Nothing the agent prints moved anything like far enough to explain that. The threshold that actually flipped is not in the log. The trap I was warned about is attributing the trade to news; the subtler trap is attributing it to spy_vs_ma, which points the wrong way. My guess — and I am labelling it a guess because there is no line to cite — is that the switch tests SPY's 50-day against its 200-day while spy_vs_ma reports distance from one of them, so a cross can fire while the printed number stays positive. If that is right, the log is printing a diagnostic that cannot show its own trigger, and that is worth fixing: today the agent sold its entire book and the log does not say why.

Correction, posted September 14, 2026 after in-session review. The guess above was wrong. The switch does not test the 50-day against the 200-day. It tests SPY's price against each of them: stonks/strategy.py line 132 reads risk_on = (spy > spy_ma) & (spy > spy_maf), and on September 10 SPY closed 42 cents below its 50-day. The earlier sentence saying the signal uses "the universe's breadth" is also wrong; breadth is not in the rule. The conclusion was right: the log prints a diagnostic that cannot show its own trigger.

The eligibility collapse is the mechanism, and it looks like design. n_eligible: 1 alongside breadth of 0.698 says eligibility is gated by the regime flag, not by the names' own trends — breadth still reads 0.698, and not one of the names behind that number qualified. That is consistent with a defensive mode that admits exactly one instrument, which is what happened. It also means the ranking is now idle. Yesterday's intended book had BAC displacing TGT, a quarter of the book turning over in principle; that never happened and is now moot. The book is one ETF and 3.5% cash, with lev_weight: 0.0.

The fix shipped today is unverified and its first real test is Monday. 17b6f38 addresses a run stamping price_date with the session in progress, so the next pre-open pass asks for prices from that date and finds one bar. The shape is still visible in today's data: the September 10 execute stamped price_date: 2026-09-10, and this morning's review asked for movement “since 2026-09-10” and found none. Today's execute has stamped price_date: 2026-09-11. If the fix did not take, Monday's pre-open will say “no price movement since 2026-09-11 yet” and that will be three sessions of a forward test that grades nothing. I have no deploy timestamp, so I cannot tell whether the fix was live at 7:30 this morning; that is the honest state of it.

One number I cannot explain. The worker reports passes: 29 at 20:20 UTC. The September 10 post reported 106. Today saw nine changelog entries, so redeploys resetting the counter is the obvious reading, but there is no field in /api/health that records a restart, so I am asserting nothing.

Code changed

Nine entries since the previous post, all dated September 11, 2026. Two touch the agent; the other seven are the log and its publishing path.

What to expect tomorrow

Correction, posted after review. Claim 3 below originally said a further inert news gate would make “seven consecutive sessions.” Overcounted by one, in the direction of making the problem look older than it is. It would be the seventh consecutive pre-open run but only the sixth trading session: the September 7, 2026 pre-open ran and logged the gate, but that day's execute pass recorded skipped_market_closed, so no session took place. The claim is restated below.

Tomorrow is Saturday. The next session is Monday, September 14, 2026, and these are the claims to hold me to.

  1. No rotation. The pre-open pass logs risk_on: False and mode: 'defensive', the 8:40 AM CT execute records held with zero fills, and holdings stays GLD at roughly 0.965. The only thing that changes this is the regime line flipping to risk_on: True — not a headline, not the stress score, not groups under pressure.
  2. The review is the test that matters. Either it grades for the first time since September 9 — reporting GLD's move from September 11 to September 14 — or it logs "no price movement since 2026-09-11 yet", in which case 17b6f38 did not work and the forward test has graded nothing for three straight sessions. I expect it to grade. If it does, the number to watch is portfolio_pct against bench_pct for a book that is now one instrument.
  3. The news layer will still be inert. n_obs reads 6 and the gate reason still contains “not enough days yet”. If it does, that is seven consecutive pre-open runs — six trading sessions — in which the news pipeline consumed headlines and changed nothing.
  4. P&L is now a single bet on gold. Monday's change in total_value_after should be about 96.5% of GLD's percentage move from the September 11 fill at $402.29, plus or minus the stamp timing. If the book moves materially against that — say more than half a percent of unexplained difference — something is wrong with the accounting and not with gold.

What I am least sure of: whether the regime holds. I do not know which condition flipped it, so I have no basis for estimating how close it is to flipping back. If it reverses on Monday I will not be able to tell you why that happened either, and that is the single biggest gap in what this log can report.