{"version":"1.1.0","schema":"https://oneagentaday.com/api/schema.json","agent":{"title":"Session Handoff","slug":"session-handoff","date":"2026-10-15","issue":41,"category":"coding","categoryLabel":"Coding & Vibe Coding","tags":["vibe-coding","handoff","cursor"],"difficulty":"easy","runtimes":["ChatGPT","Claude","Gemini","Cursor"],"excerpt":"Paste the mess from a coding session. Get a handoff note: what shipped, what is broken, and the exact prompt to paste tomorrow.","problem":"You vibe-coded for three hours, closed the laptop, and tomorrow-you has no idea what happened. The chat is a swamp. The branch has half a feature.","videoUrl":null,"url":"https://oneagentaday.com/agents/session-handoff","apiUrl":"https://oneagentaday.com/api/agents/session-handoff.json","promptUrl":"https://oneagentaday.com/agents/session-handoff/prompt.txt","configUrl":null,"configFilename":null,"license":"CC-BY-4.0","howItWorks":"When a vibe coding session ends mid-thought, the cost shows up the next morning. You reopen the chat, scroll for ten minutes, and still do not know whether the webhook was left broken on purpose.\n\nThis agent turns a messy dump into a handoff note. It does not invent commits, file paths, or \"you are 80% done.\" If you did not paste it, it is not in the handoff.\n\n## What to paste\n\nAnything that was true when you stopped: branch name, `git status`, error text, chat scraps, and the goal you had in your head. Incomplete is fine. Fiction is not. If you are unsure whether something shipped, put it under Broken.\n\n## What you get back\n\nFour sections. Shipped. Broken, ranked by what blocks the rest. Do not touch. Next prompt, written so tomorrow-you can paste it cold. If the model pads with generic advice, reply with: follow the OUTPUT format, no pep talk.","steps":[{"name":"Dump the session","text":"Before you close the editor, paste whatever you have: branch name, files touched, chat scraps, errors, and the thing you meant to finish. Ugly notes are fine. A git status paste helps."},{"name":"Paste the prompt","text":"New chat in ChatGPT, Claude, Gemini, or Cursor. Paste the prompt, then your dump. If the model invents commits or file paths, reply with: only use what I pasted."},{"name":"Save the handoff","text":"Copy the handoff into the PR description, a NOTES.md at the repo root, or the top of tomorrow's chat. The Next prompt section is meant to be pasted as-is."},{"name":"Resume once","text":"Tomorrow, paste only the Next prompt plus any new errors. Do not re-paste the whole swamp unless the handoff was wrong."}],"demo":[{"second":0,"label":"The swamp","detail":"Branch feat/billing-ui. Auth works. Billing page half done. Stripe webhook returns 400. Receipt email never fires."},{"second":8,"label":"What actually shipped","detail":"Login on staging, pricing table render, stripe package installed. Plan change is still a stub. PayPal left alone on purpose."},{"second":16,"label":"What is broken","detail":"Webhook 400, missing signature check, BillingForm customerId null, receipt email not wired. Ranked by what blocks the rest."},{"second":24,"label":"Tomorrow's first prompt","detail":"A paste-ready prompt that starts at the webhook 400, forbids touching PayPal, and asks for a signature check plus a failing test."}],"sampleInput":"Branch: feat/billing-ui\nGoal tonight: finish the billing settings page and wire Stripe webhooks.\n\nDone-ish:\n- Login + logout work on staging\n- Pricing table renders, plan change button is a stub\n- Added stripe package, keys in .env.local (not committed)\n\nBroken / unsure:\n- POST /api/stripe/webhook returns 400 on the test event\n- Receipt email never fires\n- TypeScript error in BillingForm.tsx around line 88 (customerId maybe null)\n\nChat scraps:\n- \"use the Checkout Session, not PaymentIntent\"\n- \"don't touch the old PayPal code\"\n- I was about to add a webhook signature check when I stopped\n\nNext I wanted: fix the 400, then send the receipt, then sleep.\n","prompt":"You write session handoffs for software work. You are precise and a little blunt. You help tomorrow-you resume without re-reading a three-hour chat.\n\nINPUT\nA messy dump from the person who just stopped coding. It may include a branch name, files touched, errors, chat scraps, goals, and guesses. Treat guesses as guesses.\n\nRULES\n- Only use facts from the dump. Never invent commits, PRs, file paths, line numbers, test names, or \"percent done.\"\n- If something is unclear, put it under Broken with the label \"unclear\" and say what is missing.\n- Rank Broken by blockers first. A failing webhook that blocks the receipt email comes before a tidy TypeScript warning.\n- Do not touch means constraints they stated, or fragile areas implied by \"don't touch X.\"\n- The Next prompt must be paste-ready: second person, concrete first step, explicit constraints, and what \"done\" means for that step.\n- No pep talk, no \"great progress,\" no productivity lecture.\n- If the dump is too thin to hand off, say so in two sentences and list the three questions that would unblock a real handoff. Then stop.\n\nOUTPUT\n## Shipped\nBullets. Only things that clearly work or were finished in the dump.\n\n## Broken\nNumbered. Each line: what is wrong, evidence from the dump, and why it blocks (or \"does not block\").\n\n## Do not touch\nBullets. Constraints and landmines. If none, write \"None stated.\"\n\n## Next prompt\nA fenced code block containing one prompt tomorrow-you can paste into a coding agent. It must name the first fix, the success check, and the do-not-touch list.","config":null}}