Pete

The Stack

All posts / Story (6)

Ithaca, NY

Built a dashboard to track Anthropic's open job listings. It pulls from the Greenhouse API on a schedule, stores daily snapshots in SQLite, and diffs each run against the previous day to surface new roles, closed ones, and anything that shifted. Two surfaces: a Rich terminal dashboard for quick CLI checks and a FastAPI web view when I want to see trends over time.

The motivation was practical. Applied to six Anthropic roles in March and wanted a clean way to watch the board without refreshing the careers page every morning. The delta detection ended up being the useful part. Not just 'are there new jobs' but which departments are expanding, which roles stay open for months, and what the hiring pace looks like across research vs. engineering vs. operations.

Running in Docker on nix1. Open-sourced at the link.

github.com/pete-builds/anthropic-tracker ↗

The 53 Report is live. Full tech stack: SQLite, MCP server, Claude Code agentic workflow for the editorial pipeline, Astro 5, Docker on a Hetzner VPS. Here is how it all connects.

The data layer is the SQLite database from post 045. Every draft pick since 1980, weekly rosters since 2002, per-game snap counts since 2012. About 1.3 million rows. A pick counts as a hit if the player produced 500 or more snaps in any single regular season, the line where they spent at least one year as a real rotational contributor (we started at 100 snaps and tightened the bar after publishing the first three articles).

On top of that sits an MCP server running in Docker on nix1 over Tailscale. Eight tools: team draft hit rate, round hit rate, round trends heatmap, roster composition, pick outcome for a single selection, player career arc, player search, and a database health check. The server runs SSE at port 3711 and gets queried by Claude Code during every editorial run.

The editorial pipeline is where it gets interesting. Four stages: Scout, Beat, Editor, Coach. All running inside Claude Code as custom skill agents.

Scout is read-only. It hits the MCP and returns a structured evidence pack with three to five ranked angles. No prose, no opinions, just numbers and angle proposals, ranked by anomaly vs. league, anomaly within team, regime shift signals, single-pick stories, and counter-narratives.

Beat takes the evidence pack plus the approved angle and writes the article. Every number has to be traceable to Scout's pack or a clean derivation from it. No new numbers, no player names Scout didn't surface. Targets 1,800-2,600 words depending on shape, with narrative and data woven together in every section.

Editor is the stat-fidelity gate. It reads Beat's draft against Scout's pack and returns PASS, REVISE, or BLOCK. A hallucinated stat is an automatic BLOCK. No league rank gets through without the raw value, population denominator, and era window in the same sentence.

Coach orchestrates the whole run. It reads the publishing calendar, picks the next queued team, spawns Scout, presents angles, hands the approved one to Beat, runs Editor, and calls the deploy script only after explicit approval. Never ships without that sign-off.

The product is GM Performance Grading: how well NFL general managers draft and retain talent. Three article shapes: scorecard (tenured GM, four graded columns, final letter grade), narrative (paradox or anomaly, no grade), and methodology (league-wide framing, no team focus). Three published pieces so far, twenty-nine teams queued.

The site is Astro 5, static build, deployed via rsync to Zion (Hetzner VPS, Plesk-managed). DNS through Cloudflare, proxied, Full Strict SSL. Build is clean in under ten seconds.

Long-term target is a paper for SSAC 2027 (abstract due around October 2026) and a staff or contributor role at an NFL team analytics group or a shop like SumerSports or The 33rd Team. The dataset edge is the window: Dubow's AP piece used a 2021-2024 window with binary roster data. SIS used first-round picks only with a four-year endpoint. This stack goes multi-year, snap-weighted, and position-weighted across every round.

Next up: interactive analysis with logins and custom date range filters. After that, a longer story-driven piece on the BNM blog, less technical, more about how this came together.

the53report.com ↗

Most people push-prompt. There's a better way.

At my day job, I work on a small team at a university library that hosts AI sessions for staff, helping them find ways to use AI tools in their everyday work. This was our second session in the series, focused on prompt engineering.

The session was entry-level, built around giving people a way to prompt that they could use the next day. Here's what we covered.

Push vs. Pull: Two Ways to Prompt

While researching for this session, I came across the terms "push" and "pull" prompting. Turns out I'd been doing both without realizing there were names for them. Once I saw the distinction, it made it a lot easier to explain to others.

Most people "push" prompt. They figure out exactly what they need, write it all out, and hand it over. That works for simple tasks.

But for anything complex or fuzzy, there's a better approach: pull prompting.

Instead of giving the AI turn-by-turn directions, you give it the destination and let it drive. The key sentence:

"Act as an expert [role]. I need [outcome]. Ask me all the questions you need to create this for me."

Two things happen at once: you give it an expert role and let it drive the information gathering instead of guessing what to include.

Then you just answer the questions. It asks about things you might not have thought to mention. It figures out what to ask, and you just answer. You still make the calls.

When to use which:

If you can describe exactly what you want in one sentence, push. If you'd need a whole paragraph to explain it, pull.

We also covered the 4-Part Prompt Formula

Every good prompt has four ingredients:

  1. Role: Tell the AI who to be. "Act as an experienced academic librarian" narrows the output. Without it, you get the average of everything.
  2. Context: Give it the background. The more relevant detail, the more relevant the response.
  3. Command: Be explicit. Not "write something about this." Say "write a 3-sentence reply declining this request politely and suggesting an alternative."
  4. Format: Tell it how you want the answer. Bullet points, a table, a short paragraph. If you don't specify format, it defaults to long, because long looks thorough.

The takeaway I left them with:

Pick one task you do every week that feels repetitive. A recurring email, a meeting summary, a document you always have to read and pull key points from. Try push first. Then try pull. See which one fits.

AI tools are first-draft machines. You are the editor. That doesn't change.

Side project tonight: rebuilding BandsThatJam.com from Archive.org snapshots. This is where it all started in 2007. Concert photography, live show recordings, festival reviews out of Buffalo, NY. The site has been offline for a while, but the content still exists in the Wayback Machine. Pulling it back together as a showcase of where Brooks New Media came from. Every business has an origin story. This is ours, and we are not letting it disappear.

Why now? Because the old site was a brochure. It listed services and had a contact form. That is it. No story, no personality, no reason for someone to care. We started Brooks New Media because we loved music and wanted to help our community grow online. The website should reflect that. Not just what we do, but why we do it and where we came from. Buffalo summers, GrassRoots Festival, BandsThatJam.com, Giant Panda Guerilla Dub Squad, the move to Ithaca. That is the real story. Time to tell it.