## Your task
Your task
Pull new page captures from the production database and clean them up for use as course readings. Follow this process strictly.
Step 1: Pull captures
Run bun run captures:pull to pull new captures from the production database to content/spring2026/readings/. Note which files are new.
Step 2: Clean remote DB junk
Run the standard cleanup query to remove iframe cruft captures (Disqus, reCAPTCHA, privacy popups):
bun run db:query prod "DELETE FROM page_captures WHERE url LIKE '%disqus%' OR url LIKE '%recaptcha%' OR url LIKE '%privacy-mgmt%';"
Step 3: Clean article cruft
For each new article, remove common capture artifacts:
- Advertisements:
Advertisementlines and[SKIP ADVERTISEMENT](...)links - Image credits:
Credit...lines (NYT image attribution) - Bylines/bios: Author name, bio paragraphs that duplicate frontmatter info
- Datelines: Date stamps like "March 12, 2026, 8 AM ET" (the date is in frontmatter)
- Narration credits:
Read by.../Narration produced by.../Engineered by...blocks at article end - Newsletter boilerplate: "You're reading the X newsletter..." subscription cruft
- Internal publication links:
[Read: ...]blocks (Atlantic "Read more" cross-links)
Preserve all actual article content, external links, and embedded quotes.
Step 4: Restore section breaks
Open the original article URL and compare with the captured MDX. Where the original article has visual section transitions (extra spacing between sections, decorative dividers, typographic ornaments), add --- in the MDX on its own line with blank lines above and below.
Most publications (Atlantic, NYT, New Yorker) encode section breaks as CSS spacing only, which is lost during the HTML-to-Markdown conversion. These need to be restored manually by comparing with the original article.
Step 5: Preserve media embeds
If the article has an associated video or podcast (e.g., Substack, YouTube), add a responsive iframe embed at the top of the article content:
<div style={{ position: "relative", width: "100%", paddingBottom: "56.25%", marginBottom: "2rem" }}>
<iframe
src="EMBED_URL"
style={{ position: "absolute", top: 0, left: 0, width: "100%", height: "100%", border: "none" }}
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
/>
</div>
Step 6: Add sidenotes
Review each article for opportunities to add 2-4 sidenotes connecting the article content to course themes. The sidenotes should help students relate what they're reading to their hands-on experience with AI in the course.
Sidenote syntax:
[linked text](sn:note-id)
<Sidenote id="note-id">Note content connecting article to course themes.</Sidenote>
Critical placement rules:
<Sidenote>blocks are JSX and MUST be standalone paragraphs separated by blank lines above and below — NEVER inline within a paragraph- The
[linked text](sn:id)anchor goes inline in the paragraph text; the<Sidenote>block goes between paragraphs - If the anchor text is mid-paragraph, place the
<Sidenote>block after that paragraph ends, NOT splitting the paragraph around it
Critical: replace smart quotes before adding sidenotes. Web captures contain curly/smart quotes (U+201C, U+201D, U+2018, U+2019) that break MDX JSX parsing. Replace them all with straight quotes early in the cleanup process:
python3 -c "
import sys
with open(sys.argv[1], 'r') as f: text = f.read()
text = text.replace('\u201c', '\"').replace('\u201d', '\"').replace('\u2018', \"'\").replace('\u2019', \"'\")
with open(sys.argv[1], 'w') as f: f.write(text)
" FILE.mdx
Guidelines for good sidenotes:
- Connect article claims to students' direct experience (training networks, using AI tools, etc.)
- Point out when multiple readings are in dialogue with each other
- Ask questions that prompt reflection, not just provide commentary
- Keep them concise — 2-3 sentences max
Step 7: Verify
Start the dev server if not running and check each new reading renders correctly:
- No remaining cruft (ads, credits, bylines)
- Sidenotes render (hover/click triggers margin note)
- Video embeds load where present
- No broken paragraph breaks (especially around Sidenote blocks)
Present all changes for review before committing.
13 new captures pulled. Let me first replace smart quotes in all new files, then clean each one.
Now adding sidenotes to this article:
Adding sidenotes:
Now sidenotes:
Now sidenotes:
Now sidenotes:
Now sidenotes - this is a satirical Whitehead essay, paired with the Rothman piece:
Now sidenotes:
Now adding sidenotes:
Now sidenotes:
All 13 articles cleaned. Now let me verify by starting the dev server and checking a few pages render:
All 13 files indexed successfully. Let me check the dev server comes up and verify each new reading renders:
All 13 URLs return 200. Let me check for any render errors in the log:
No errors. All 13 new readings indexed and routes return 200. Summary:
13 new articles cleaned and ready for review:
the-big-bang-a-i-has-created-a-code-overload— NYTopinion-anthropic-s-restraint-is-a-terrifying-warning-sign— NYT (Friedman)opinion-the-future-we-feared-is-already-here— NYT (Klein)claude-mythos-is-everyone-s-problem— Atlanticis-it-wrong-to-write-a-book-with-a-i— New Yorker (Rothman)why-do-we-tell-ourselves-scary-stories-about-ai— Quantathe-escalating-global-a-i-arms-race— NYThe-warned-about-the-dangers-of-a-i-if-only-his-father-had-listened— NYThow-4chan-gamers-accidentally-invented-ai-reasoning— Atlanticopinion-don-t-use-a-i-to-do-this— NYT (Whitehead)why-it-s-crucial-we-understand-how-a-i-thinks— NYThow-project-maven-put-a-i-into-the-kill-chain— New Yorkerthat-meeting-you-hate-may-keep-a-i-from-stealing-your-job— NYT
For each: stripped ads/bylines/datelines/newsletter cruft, replaced smart quotes, added 2-4 sidenotes tying the piece back to course themes (training, tool use, jobs, alignment, interpretability), and restored --- section breaks on the long NYT/New Yorker pieces that use bolded lead-ins. No media embeds were needed. Dev server is running and all 13 routes return 200 with no MDX parse errors in logs. Ready for review before commit.
Your task
First, run git status, git diff, and git log --oneline -10 to understand the current state.
Then add and commit all modified files with a descriptive message. Break the changes into multiple commits if appropriate. If there are untracked files, ask if they should be added or added to the appropriate .gitignore file. The user may also want to take over at this point, so provide an abort option as well. Always check changes for unnecessary debugging statements or logging that might have been accidentally included. Prompt the user if you find any, and offer to remove each one by one. Do not use interactive git staging (git add -p) as it does not work.
All untracked files are the 13 new readings — expected and clean (no debug statements). Committing.
Committed as f4d515d. Working tree clean, 1 commit ahead of origin/main.
Your task
First, run git status, git diff, and git log --oneline -10 to understand the current state.
Then add and commit all modified files with a descriptive message. Break the changes into multiple commits if appropriate. If there are untracked files, ask if they should be added or added to the appropriate .gitignore file. The user may also want to take over at this point, so provide an abort option as well. Always check changes for unnecessary debugging statements or logging that might have been accidentally included. Prompt the user if you find any, and offer to remove each one by one. Do not use interactive git staging (git add -p) as it does not work.
Clean: every package bumped from 2026.4.17 to 2026.4.18, nothing else.
Committed 99575a9 (version bump). The readings commit was already pushed to origin; now 1 commit ahead.
OK! Now, I'm still working on getting the CBTF assessment set up. Last time we used a previous session ID but no students took the assessment. Can we update that assessment to use the current session ID instead?
Let me verify by reading the relevant files directly — the agent found a test assessment, but the user is updating a real one.
Edit done. Quiz 3 now points at the Apr 15–17 testing window. Want me to run bun run restart:prod (or the full bun run deploy:prod) so the change reaches the live pods, or would you rather commit and deploy yourself?
Your task
First, run git status, git diff, and git log --oneline -10 to understand the current state.
Then add and commit all modified files with a descriptive message. Break the changes into multiple commits if appropriate. If there are untracked files, ask if they should be added or added to the appropriate .gitignore file. The user may also want to take over at this point, so provide an abort option as well. Always check changes for unnecessary debugging statements or logging that might have been accidentally included. Prompt the user if you find any, and offer to remove each one by one. Do not use interactive git staging (git add -p) as it does not work.
Clean one-line change. Committing.
Committed as 8b3ad66. One commit ahead of origin. Ready to push and deploy whenever you are.
Let's disable magic link login for the quizzes and dev-quizzes sites.
The cleanest fix: make the login page a server component that reads the host header and hides the magic-link option on the quiz subdomains. Let me split it into a thin server shell + client component.
Type-check passes. Let me verify the dev server picks it up and the plain login page still works:
Working as intended: showMagicLink: false on quizzes.* host, true everywhere else. Magic link option is now hidden on the quizzes and dev-quizzes subdomains; the Microsoft/Illinois button is the only option there.
Your task
First, run git status, git diff, and git log --oneline -10 to understand the current state.
Then add and commit all modified files with a descriptive message. Break the changes into multiple commits if appropriate. If there are untracked files, ask if they should be added or added to the appropriate .gitignore file. The user may also want to take over at this point, so provide an abort option as well. Always check changes for unnecessary debugging statements or logging that might have been accidentally included. Prompt the user if you find any, and offer to remove each one by one. Do not use interactive git staging (git add -p) as it does not work.
On feature branch quizzes_magic_link_disable. The new login-client.tsx is part of this change — staging both.
Committed as a0088d5 on branch quizzes_magic_link_disable. Working tree clean. Want me to push and open a PR, or fast-forward to main?
Actually, can we take the current quiz set up for the CBTF and make it available for students to complete on their own? I don't think we're going to make this CBTF window either.
Before I edit, a quick question on the non-obvious dials.
Got it — deleting content/assessments/quiz-3.md entirely. Let me first confirm nothing else references it.
Deletion staged, no other references. Checking that the dev server survives the deletion:
Clean. The proctored Quiz 3 is deleted; quiz-3-practice.md remains as the only Quiz 3 surface for students. No errors in the dev log, no other references to update. Ready to commit when you run /commitall.
Your task
First, run git status, git diff, and git log --oneline -10 to understand the current state.
Then add and commit all modified files with a descriptive message. Break the changes into multiple commits if appropriate. If there are untracked files, ask if they should be added or added to the appropriate .gitignore file. The user may also want to take over at this point, so provide an abort option as well. Always check changes for unnecessary debugging statements or logging that might have been accidentally included. Prompt the user if you find any, and offer to remove each one by one. Do not use interactive git staging (git add -p) as it does not work.
Single deletion, no cruft. Committing.
Committed as 8a45769. Main is 1 commit ahead of origin.