{"version":"1.1.0","schema":"https://oneagentaday.com/api/schema.json","agent":{"title":"Commit Message Fortune","slug":"commit-message-fortune","date":"2026-09-13","issue":9,"category":"fun","categoryLabel":"Fun & Weird","tags":["git","humor","writing"],"difficulty":"easy","runtimes":["ChatGPT","Claude","Gemini"],"excerpt":"Paste what the diff did. Get a Conventional Commit a teammate can trust, and a fortune you will not push.","problem":"You know the change worked and you still type 'fix stuff' because writing the real sentence feels longer than the fix.","videoUrl":null,"url":"https://oneagentaday.com/agents/commit-message-fortune","apiUrl":"https://oneagentaday.com/api/agents/commit-message-fortune.json","promptUrl":"https://oneagentaday.com/agents/commit-message-fortune/prompt.txt","configUrl":null,"configFilename":null,"license":"CC-BY-4.0","howItWorks":"The useful output is a Conventional Commit a teammate can trust next month. The fortune is the joke you are not allowed to push. You paste what the diff did and what it must not mention. You commit only the plain message.\n\nThe joke can tease the code. It cannot tease a person, a customer, or a group. If the only funny version needs a name you were told to leave out, the fortune is one dry sentence and the plain message still ships.\n\nSubject line under 72 characters. Body only if the reason is not obvious from the subject. No ticket number you did not provide.","steps":[{"name":"Say what the diff did","text":"One to five lines: the behavior that changed, the test you ran, and anything the message must not include. You do not need to paste a secret or a customer name to get a good subject."},{"name":"Paste the prompt","text":"You get two outputs. The first is the message you may commit. The second is a fortune-cookie version that stays in the chat."},{"name":"Commit the plain one","text":"Copy the Conventional Commit. If the subject wraps past 72 characters, shorten it before you commit. Leave the joke out of git log."},{"name":"Keep the fortune if it helps you remember","text":"The joke is for you. If it names a person, a customer, or a slur, it failed. Throw it away and keep the plain message."}],"demo":[{"second":0,"label":"The change","detail":"Checkout sums the cart on the server again and ignores a client total of 1."},{"second":8,"label":"The real message","detail":"fix: compute order totals from the cart, not from the request body."},{"second":16,"label":"The fortune","detail":"A cookie that says the cart was the adult in the room. It does not go in the commit."},{"second":24,"label":"The cut","detail":"No customer name, no ticket you do not have, subject short enough to read in git log."}],"sampleInput":"Repo: billing API.\nThe diff stops trusting body.total and sums the cart on the server again.\nTests: the new test posts a fake total of 1 and expects the stored total to match the cart.\nNo ticket number. No breaking API change. Do not mention the customer's name anywhere.","prompt":"You write two commit messages from a description of a diff. One is safe to commit. One is a fortune cookie that must not be committed.\n\nINPUTS\n- What changed, in the author's words.\n- Test they ran, if any.\n- Forbidden: names, customers, or tickets they said to leave out.\n\nRULES\n- The committable message uses Conventional Commits: feat, fix, docs, refactor, test, chore. Pick one.\n- Subject is imperative, no period, 72 characters or fewer.\n- Body is optional and only for the reason. Do not restate the subject.\n- Do not invent a ticket, a co-author, or a breaking-change footer unless they said so.\n- The fortune is one or two sentences. It may tease the code. It may not tease a person's body, identity, family, or any name on the forbidden list.\n- If you cannot be funny without breaking that rule, write a flat fortune: \"The diff did the thing. You may go.\"\n- Label the fortune DO NOT COMMIT.\n\nOUTPUT\n## Commit\nThe message inside a fence.\n\n## Fortune\nDO NOT COMMIT\nThe joke.\n\n## Why this type\nOne line on the Conventional Commit type you picked.","config":null}}