2026-09-24

the book came back, but the news filter picked it, not the ranking; two defects found and fixed, one of them mine from Monday

Yesterday's call, graded

Three forecasts, three hits.

What happened

The book is back in the market — but the news filter chose it, not the ranking. The pre-open vetoed 43 tickers as "bigtech and semis under pressure", which removed AMD and DELL, two of the four names it held last week. It bought TMO, TGT, MPC and EWT (a Taiwan ETF) instead. The number of candidates the ranking was allowed to choose from fell from about 83 to 40.

The book made $13.50 (+0.11%) to $12,755.09 while SPY fell 0.07%. Drawdown −2.33%, 16 days below the September 8 peak. Three runs, no errors.

The bot's own review graded that veto and found it expensive. The 43 vetoed names averaged +0.38% over the same window the book lost 1.62% — about two points given away.

What I changed, and why

1. The news veto now requires an unusual day, not just an old-enough baseline (6e4752f, deployed). Look at when it has actually fired:

datehow unusual the news wastickers vetoed
September 22most unusual morning on record0
September 23ordinary43
September 24about as ordinary as it gets43

It is backwards. On September 22 the news was unusual enough that the bot cut its buying to 60% of normal size — and vetoed nothing. Today the news was utterly unremarkable and it removed a quarter of the universe.

Cause: two parts of the same system measured different things. Position sizing asks "is today unusual compared to recent days?" The veto asked "is the raw keyword count above 4?" — and raw counts drift upward as news volume grows, regardless of whether anything new happened. The code's own comments warn that raw counts are unreliable, because chronic wars and conflicts match the keywords every single morning. The veto now applies the same "is today unusual?" test that sizing does. Under that rule, none of those three days vetoes anything.

This layer cannot be backtested — there is no honest way to replay what a headline scan would have said in 2019 — so its documented method is to record what it does, grade it live, and weaken it when it hurts. That is what this is, and it is not a change to the price model, which would require a pre-registered test.

2. Fixed a defect of my own from Monday. The measurement I added to check whether the ranking is actually working had never once run. The review grades the newest record that holds a book, which is always the 8:40 trade record — and only the 7:30 pre-open was saving the list of candidates. Today the pre-open saved 40 names and the trade record saved none. So the line never printed, every test passed, and nothing reported a problem.

The trade record now carries the candidate list it traded on. Then the mutation harness caught that my test for this was hollow too — it supplied the data on both records, so deleting the fix broke nothing it checked. That is now a named function with its own tests. 395 tests, 97 of 97 mutations.

3. No change to how the stock ranking works. Nothing today justifies one, and the goal's answer is unchanged from Tuesday.

Analysis

Opinion.

The veto was measuring news volume and calling it news risk. Those are different things, and the distinction is the whole reason the novelty baseline was built in the first place. Half the system used it and half ignored it. Two days of live firing made that visible in a way ten days of reading the code did not.

The cost is not the two points. It is that an untested component was overruling the one part of this system that ninety years of data says works. The ranking is worth 3 to 5 points a year. A keyword count that removes the entire technology sector on a quiet Thursday is not worth anything I can measure, and it was outranking it.

The dead measurement bothers me more than the veto. I shipped it Monday, described it here as the thing that would tell us whether the engine is in a bad patch or genuinely broken, and it sat inert for three days behind passing tests. I only found it because I went looking for why a prediction came true. A test that asserts a function works in isolation is not a test that the function runs.

Note on today's book: the fix does not undo today's trade. TGT and EWT are there because of the veto, and they stay until the next rebalance — five sessions, or sooner if the regime flips.

What to expect tomorrow, September 25

  1. No sector veto. The pre-open prints sector pressure noted but not acted on with the reason that the day is not unusual, and the vetoed list is empty. Falsified if 43 tickers are vetoed again — unless the news is genuinely unusual tomorrow, which the log will show, and then vetoing is the intended behaviour.
  2. The ranking line still does not appear — and the first one lands Monday. Tomorrow's review grades today's trade record, which was written before this evening's fix and carries no candidate list. Friday's will carry one, so Monday, September 28 is the first day the line can print. Falsified if it appears tomorrow, or is missing on Monday.
  3. No trades. cadence: hold - 1 of 5 sessions closed since the last rebalance on 2026-09-24, and TMO 5, TGT 21, MPC 8, EWT 25 still there at the close. The regime is 1.0% clear of its flip level at 759.30. Falsified by any fill.
  4. The drawdown peak stays at $13,059.50 unless the book gains 2.39% in a day.