The operator runbook · one month, step by step

What you actually do, and where.

Every step is tagged: PC a command in the terminal at C:\Dev\upwave · PHONE this website · T212 the Trading 212 app. Total human time: about 30 minutes a month.

Step 0 · before Cycle 1 only · seed the notional paper book

PC Seed the paper book

Done once, ever. Phase A trades no real money, but the machine needs a notional pot or the sheet is all empty cash slots. Recommended: £1,000; the paper cycles then rehearse exactly the Phase B book that goes live after three clean months. (Owner decision; change the number if you choose differently.)

.venv/Scripts/python -c "from datetime import date; from upwave.portfolio import PortfolioState, save_state; from pathlib import Path; save_state(PortfolioState(cash=1000.0, as_of=date.today()), Path('data/state/portfolio.json')); print('paper book seeded')"

Saturday · screen day (first Saturday of the month)

PC 1 · Run the screen

The date must be today's: the machine refuses any other for live data. First run of a month takes 10–15 minutes (it fetches ~300 price histories politely, two seconds apart). Let it finish.

.venv/Scripts/python -m upwave.screen --date 2026-08-01

What gets written, automatically: reports/2026-08/funnel.md · reports/2026-08/order-sheet.md (the canonical records) · site/cycles/2026-08/index.html (the page you'll read) · raw data archived under data/snapshots/2026-08/.

PC 2 · Publish

npx vercel deploy --prod --yes

PHONE 3 · Read the cycle page

Open the site → Cycles → this month. Verdict, sheet, mix, funnel, league. Note the Saturday in-app checks list: new names the machine has never seen venue-verified.

PHONE T212 4 · Check and capture the new names

For each name in the Saturday list: open Trading 212 → SIPP → search the ticker → open the order ticket. On the cycle page tap exactly one result: Ticket opens · fractional, Ticket opens · whole-share only, or Not available. Download availability-YYYY-MM-DD.csv and get it to the PC.

.venv/Scripts/python -m upwave.fills --availability availability-2026-08-01.csv

The import validates every row before atomically appending the availability record. No fills, costs, or portfolio state are touched.

PC 5 · Only if something got an “n”: re-run from the archive

The machine promotes the next-ranked name and finalises the sheet, using Saturday's archived data, never a fresh fetch:

.venv/Scripts/python -m upwave.screen --date 2026-08-01 --from-snapshot data/snapshots/2026-08

Then publish again (step 2).

Monday · execution day

T212 6 · Execute the sheet, top to bottom

Market orders, in sheet order, nothing else: this is where the no-override rule lives. Phase A: don't place orders; open each instrument and note what a £-order would have filled at (the app shows shares-per-£ before you'd confirm).

PHONE 7 · Capture as you go

On the cycle page: tap each row → enter qty and price exactly as the app shows it (pence for UK, dollars for US) → ✓ Filled. Ticket wouldn't open? ✕ Not available. Taps save on your phone. When done: Downloadfills-2026-08-01.csv. Get the file to the PC.

PC 8 · Import: the record becomes real

.venv/Scripts/python -m upwave.fills --import "C:\Users\oemma\Downloads\fills-2026-08-01.csv" --date 2026-08-03

(--date is the Monday.) Automatically: the book advances, reports/2026-08/fills.csv and costs.csv are written, and any Not available taps update the availability file for you: no hand-editing on Mondays. If it says a promotion is needed, repeat step 5, execute just the promoted rows, and import those fills too (partial imports are fine).

PC 9 · Commit the month and publish

git add -A && git commit -m "Cycle 2026-08: screen and fills" && git push
npx vercel deploy --prod --yes
.venv/Scripts/python -m upwave.paper --date 2026-08-01

This writes the canonical Paper, its HTML page, and the separate compliance record.

Arrives with M6: the Saturday screen can fire on a schedule, and connecting the repo in the Vercel dashboard makes publishing automatic on push; steps 2 and the deploys in 9 then disappear.

The rest of the month

Nothing. No prices, no news, no peeking. The system is deliberately blind between screens, and so are you. The only exception: a forced corporate event (suspension, delisting, takeover).

Who does what

division of labourtoday · and after M5/M6
Division of labour: each task today and after M5/M6
TaskTodayAfter M5/M6
Screen, gates, ranking, decisions, recordsmachinemachine (scheduled)
Reading the sheetphonephone
Saturday venue checksT212 + phone taps → 1 import commandsame
Monday executionT212 (human forever, by design)T212 (human, forever)
Recording fills & venue surprisesphone taps → 1 import commandsame
The Paper1 command1 command
Publishing the site1 commandautomatic on push
The terminal never disappears entirely: it is the audited gate into the record, on purpose. But it shrinks to: run screen (until scheduled), import fills, commit.