tp3_scripts/ on Apex tonight. The only thing standing between now and a real listening dump is a Spotify Developer app's client_id + client_secret, which I can't create without you signed in. When you wake and confirm /mcp on chrome-devtools, the unblock is a five-minute, one-click handshake — I drive developer.spotify.com in your real Chrome, you click Approve once. Then this report regenerates with real artists, real shows, real time-of-day patterns instead of the projected shape below.
| Piece | State | Path / notes |
|---|---|---|
tp3_spotify_pull.py | SHIPPED | /mnt/c/Users/Breezy/tp3_neural_stack/tp3_scripts/tp3_spotify_pull.py — OAuth bootstrap (PKCE + state guard), recently-played walker with before= cursor pagination, refresh-token persistence in ~/spotify_history/refresh_token.txt (chmod 600), ntfy summary on completion (ASCII title per the May-19 gotcha rule). |
tp3_spotify_load_to_pg.py | SHIPPED | /mnt/c/Users/Breezy/tp3_neural_stack/tp3_scripts/tp3_spotify_load_to_pg.py — reads listening_history.json and idempotently upserts into spotify_recently_played. Has --ensure-schema flag that applies the DDL inline so the load can self-bootstrap. |
tp3_spotify_ddl.sql | APPLIED | Lives at /mnt/c/Users/Breezy/tp3_neural_stack/tp3_scripts/tp3_spotify_ddl.sql. Live on tp3_neural_stack_brain_db: 1 table (spotify_recently_played, unique on (spotify_uri, played_at)), 4 indexes (played_at DESC, item_type, show_id-where-episode, artist-where-track), 4 views (spotify_episodes_recent, spotify_tracks_recent, spotify_top_shows_90d, spotify_top_artists_90d). |
| credential template | SHIPPED | /home/breezy/spotify_history/.env, chmod 600, three blank slots, SPOTIFY_REDIRECT_URI pre-filled to http://127.0.0.1:8765/callback. |
| real pull executed | BLOCKED | No Spotify Developer credentials exist anywhere on Apex or in the TP3 .env. Verified with a full grep across ~/, ~/.config/, and the TP3 stack root. |
I need a Spotify Developer app's client_id + client_secret — a 3-minute creation in your signed-in Chrome at developer.spotify.com. After that, the first run is one --bootstrap-oauth click (you tap Approve on Spotify's consent screen, my helper captures the callback) and every subsequent nightly pull runs unattended for years on the refresh token.
Your one action to unblock: when you give me /mcp confirm on chrome-devtools, I open developer.spotify.com directly in your real Chrome, create the app called “TP3 Spotify Pull”, set redirect to http://127.0.0.1:8765/callback, copy the two secrets into Apex's ~/spotify_history/.env, and fire tp3_spotify_pull.py --bootstrap-oauth. You click Approve once. Total elapsed: under five minutes from your “go.” Per the no-directions rule, that's the handoff — not a checklist for you to walk.
The spec called Phase 1 “the listening signal” — what landed in your ears, when, for how long. It's the cheap, ToS-clean, no-LLM-tokens dump that lets us see before we spend cycles on transcripts. Even with zero transcripts, the table answers immediately:
SELECT * FROM spotify_top_shows_90d. One query, instant.SELECT * FROM spotify_top_artists_90d.played_at between two timestamps, group by hour.name and show_name over a date window.None of these need Phase 2. They drop out of Phase 1 the moment the JSON lands.
played_at is when the play started, so very short windows between consecutive plays are skip evidence. Useful for “what I think I like vs what I actually finish.”context_uri tells us playlist vs album vs artist-radio vs solo-track. A heavy Spotify-curated lean would change how we think about your discovery loop.name surfaces which AI topics dominated your week. (Claude / Anthropic / Claude-Code lane stays first-class per the May-19 brief rule.)/me/shows against actual plays. Brief could nudge them on slow weeks.tp3_spotify_pull.py --dry-run against the missing-creds state on Apex. Exit code 2, stderr FATAL: SPOTIFY_CLIENT_ID not set .... Confirmed: no silent-continue.CREATE TABLE IF NOT EXISTS, indexes guarded, views use CREATE OR REPLACE. Re-runs are safe.chmod 600.TP3_POSTGRES_PASSWORD env (already populated in tp3_neural_stack/.env), not hard-coded.reference_ntfy_ascii_title_2026-05-19 rule (Title goes through encode('ascii','replace')).feedback_ssh_docker_exec_leak_2026-05-19: every docker probe this session used timeout, single-call style, no heredoc bundles. Apex docker daemon was briefly wedged mid-session from zombie sudo processes from earlier today (10:10 + 10:13 PT slots); it recovered on its own within ~3 minutes. No new zombies left by my work./mcp if needed). I drive the rest..env, fire --bootstrap-oauth. You click Approve once. Done.