# PP Data to PP Feeds: hourly shadow for the 60 s and 30 s pickers (8 Oct 2026, 18:50 Bangkok; Manager ask, Ben's goal)

Goal (Ben): the AI picker learns every hour. The running test's model only changes when the Test Manager / Ben promotes it; a challenger
learns beside it and is scored on honest paper results. Round 5 (`aipick5.py`) already does this; the 60 s / 30 s picker
(`/opt/hist/aipick.py`, services aipick and aipick30) does not. Two small changes in that picker, both paper only:

1. **Log the features of EVERY coin it scores**, not only picks. Table `scored` gets a `feats` TEXT column (the same JSON already
   stored in `picks.feats`). PP Data's hourly trainer needs these to learn from the live coins without train/serve skew.
2. **Run a shadow model as separate paper books.** Copy the round-5 pattern (aipick5.py lines ~130 and ~345):
   load `/opt/hist/analysis/aimodel_h.pkl` (60 s) or `aimodel30_h.pkl` (30 s) when it exists, reload on mtime change, decide with it
   next to the champion, and book its picks in the same `picks` table under a `model` column value `champion_h` (champion picks
   get `champion`). Same entry, size and exits as the champion. Never let the shadow change the champion's decisions.

Already done by PP Data:
- The daily retrain no longer overwrites aimodel.pkl / aimodel30.pkl (it writes `.challenger.pkl`); promotion is
  `/opt/offload/promote_model.sh` on the Test Manager's or Ben's word.
- Scoreboard http://159.223.88.168/hx-c9ois/review/picker-learning.json picks up `<book>_h` rows automatically.
- Once (1) is live, PP Data ships `aimodel_h.pkl` / `aimodel30_h.pkl` hourly (about one day later).
