Ethan's innovation-engine generates ideas that live in terminal output and get lost, while his TCL NXTPAPER tablet is the one surface he actually reads away from the desk. This pulls each day's unrealized ideas from idea-realization-tracker and renders them as a single e-ink-friendly PDF card with a handwriting box under each, then routes his stylus verdict back into the queue. Ideas get decided during coffee instead of decaying in a log.
Create ~/.local/bin/idea-stylus-card (bash, ~80 lines). Daily 06:30 cron: query idea-realization-tracker for ideas with status unrealized and age <14d, take top 5. Render markdown -> PDF via the same pandoc/wkhtmltopdf path pondercard-generate uses; each idea gets title, one-line pitch, and three checkboxes (BUILD / LATER / KILL) plus a blank ruled box for a note. Write to ~/Tablet/DocMarkup/ideas-$(date +%F).pdf so tablet-sync picks it up. Second half: a 20:00 cron scans ~/Tablet/DocMarkup/ for annotated returns, pipes the page through the existing yt-transcript-style OCR/vision call (claude -p with the PNG) to extract which box was ticked, and writes the verdict back via idea-realization-tracker --set-status. BUILD verdicts additionally enqueue a scaffold job through workq. Reuse stylus-reply-router for the return-file detection so no new watcher is needed.
## What I created
- **`~/bin/idea-stylus-card`** (executable, 98 lines) — two modes:
- `emit`: pulls the innovation engine's still-undecided ideas (≤14 days old, top 5) and renders one e-ink-friendly PDF card to `~/Tablet/DocMarkup/ideas-<date>.pdf` — each idea gets its title, proposal date, BUILD/LATER/KILL boxes, and a ruled note box.
- `collect`: finds annotated returns (`ideas-*-annotated.pdf` / `-markup.pdf`), rasterizes them, has Claude read which box was ticked, writes the verdict back onto the idea in the engine's history, files a scaffold job in the work queue for every BUILD, and moves the page into `processed/`.
- **`~/bin/idea-stylus-card.test.sh`** — 14 assertions, all passing, fully sandboxed (fake state file, fake Claude and workq binaries): age/built filtering, checkbox rendering, verdict write-back, one-job-per-BUILD, file archival, and no double-enqueue on re-run.
- **Two cron entries** (06:30 emit, 20:00 collect), appended without touching existing lines.
**Live end-to-end:** `emit` ran against the real engine history and produced today's card with 5 genuine undecided ideas.
Three places the plan didn't match reality, so I built against what's actually there:
- `idea-realization-tracker` has no `--set-status` or query interface — it's a Gemma report generator. I read/write the engine's `state.json` history directly (adding a `verdict` field), which is the actual source of truth behind that tracker.
- pandoc and wkhtmltopd