{
 "vendor": "ChatGPT",
 "maker": "OpenAI",
 "generated": "2026-10-05T15:04+00:00",
 "newest_comment": "2026-10-05T14:43+00:00",
 "window_days": 60,
 "people": 4059,
 "source": "https://machinemorning.com/giveaway/chatgpt.html",
 "habits": [
  {
   "key": "emdash",
   "name": "The ChatGPT em dash",
   "applies_to": "writing",
   "instruction": "Use at most one \"—\" in a reply and none in a casual message such as a text or a comment. Join an aside with a comma or parentheses or make it its own sentence, and when dashes are banned rewrite the sentence instead of moving the same pause to \"--\" or \";\" or \"...\".",
   "substitutes": [
    "--",
    ";",
    "...",
    "…"
   ],
   "checks": [
    {
     "target": "text",
     "regex": "—[^\\n]*—",
     "flags": "",
     "what": "two dashes in one paragraph"
    },
    {
     "target": "text",
     "regex": "\\w ?— ?(?:it|that|this|they)[’']?(?:s|re)\\b",
     "flags": "i",
     "what": "dash before a correction"
    },
    {
     "target": "text",
     "regex": "\\w -- \\w",
     "flags": "",
     "what": "double hyphen as dash"
    }
   ],
   "not_a_ban_on": "A single dash in long formal prose stays fine.",
   "people_60d": 339,
   "last_seen": "2026-10-05",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#emdash"
  },
  {
   "key": "format",
   "name": "Bullets, bold, emoji, line breaks",
   "applies_to": "writing",
   "instruction": "Answer a conversational question in plain paragraphs with no emoji or dividers. Use headers or bullets only for a real sequence of steps or options, and bold nothing inside a sentence.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "[\\U0001F300-\\U0001FAFF☀-➿]",
     "flags": "",
     "what": "emoji in the answer",
     "min": 2
    },
    {
     "target": "text",
     "regex": "(?m)^#{1,4} \\S",
     "flags": "",
     "what": "Markdown header in chat",
     "min": 2
    },
    {
     "target": "text",
     "regex": "[a-z,] \\*\\*[^*\\n]{2,60}\\*\\*",
     "flags": "",
     "what": "bold phrase inside a sentence",
     "min": 2
    }
   ],
   "not_a_ban_on": "Lists and headers stay fine for content that really is a list or a reference.",
   "people_60d": 143,
   "last_seen": "2026-10-05",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#format"
  },
  {
   "key": "rhythm",
   "name": "One line per sentence",
   "applies_to": "writing",
   "instruction": "Group related sentences into paragraphs of three to five sentences and keep that density in long chats and emotional scenes. Save a one-line paragraph or a run of verbless fragments for one moment in a piece, and in dialogue let a speaker finish a full thought before the reply.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "(?:^|\\n\\s*\\n)[^\\n]{1,80}\\n\\s*\\n[^\\n]{1,80}\\n\\s*\\n[^\\n]{1,80}(?=\\n\\s*\\n|\\s*$)",
     "flags": "",
     "what": "three one-line paragraphs running",
     "min": 2
    }
   ],
   "not_a_ban_on": "An occasional short paragraph for emphasis stays fine.",
   "people_60d": 117,
   "last_seen": "2026-10-05",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#rhythm"
  },
  {
   "key": "notx",
   "name": "It's not X, it's Y",
   "applies_to": "writing",
   "instruction": "State the point directly and use a corrective contrast such as \"it's not X, it's Y\" at most once in a piece, and only when someone holds the view you correct. In supportive replies describe what the person did or can do next and skip reassurance about worries they never voiced.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "\\b(?:(?:it|this|that)[’']?s not|is not|(?:is|was|are)n[’']?t)\\b[^.!?\\n]{1,80}?(?:[,;:—–]|\\.)\\s*(?:(?:it|this|that|they)[’']?(?:s|re)\\b|(?:it|this|that|they) (?:is|are)\\b)",
     "flags": "i",
     "what": "corrective contrast sentence",
     "min": 2
    },
    {
     "target": "text",
     "regex": "\\bnot (?:just|only|merely) [^.!?\\n]{1,60}?,? but\\b",
     "flags": "i",
     "what": "not just X but Y",
     "min": 2
    },
    {
     "target": "text",
     "regex": "(?:^|[.!?]\\s+)Not [^.!?\\n]{1,40}[.!?]\\s+Not [^.!?\\n]{1,40}[.!?]",
     "flags": "",
     "what": "stacked Not fragments",
     "min": 2
    }
   ],
   "not_a_ban_on": "One pointed contrast against a view someone really holds stays fine.",
   "people_60d": 44,
   "last_seen": "2026-10-05",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#notx"
  },
  {
   "key": "vocab",
   "name": "Middle-manager vocabulary",
   "applies_to": "writing",
   "instruction": "Write in the register of the request so a casual message reads casual, and pick the plain word (\"use\", \"strong\", \"important\", \"also\") over \"leverage\", \"robust\", \"crucial\" or \"moreover\". Drop template courtesy lines like \"I hope this finds you well\" and watch the current pet words (\"signal\", \"surgical\", \"that tracks\") as closely as the old list.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "\\b(?:delv(?:e|es|ing)|tapestry|testament to|multifaceted|leverag(?:e|es|ing)|robust|seamless(?:ly)?|crucial|realm|moreover|furthermore|utiliz(?:e|es|ing))\\b",
     "flags": "i",
     "what": "memo word in plain prose"
    },
    {
     "target": "text",
     "regex": "\\b(?:it[’']s (?:worth noting|important to note)|in today[’']s fast-paced world|I hope this (?:message |email )?finds you well|after careful consideration|future endeavou?rs)\\b",
     "flags": "i",
     "what": "template courtesy line"
    }
   ],
   "not_a_ban_on": "Formal words stay fine in formal documents where a person would use them.",
   "people_60d": 30,
   "last_seen": "2026-09-30",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#vocab"
  },
  {
   "key": "opener",
   "name": "Stock signposts and teaser closers",
   "applies_to": "writing",
   "instruction": "Start with the answer itself and drop sincerity or calm-down tags such as \"And honestly?\" or \"take a breath\". When a follow-up tip is useful give the tip itself, in place of a teaser like \"If you want, I can show you the one mistake most people miss\".",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "\\b(?:and )?honestly\\?",
     "flags": "i",
     "what": "\"honestly?\" as a beat"
    },
    {
     "target": "text",
     "regex": "\\bif you(?:[’']d like| want)\\b[^.\\n]{0,40}\\bI can (?:also )?(?:show|tell|give|walk|share)\\b",
     "flags": "i",
     "what": "teaser offer at the end"
    },
    {
     "target": "text",
     "regex": "(?:\\bhere[’']s the (?:thing|kicker|catch)\\b|\\bthe best part\\?|\\btake a (?:deep )?breath\\b|\\bdeep breath\\b|\\bno fluff\\b|\\blet[’']s dive in\\b|\\bit[’']s (?:important to note|worth noting)\\b|\\bthe distinction matters\\b)",
     "flags": "i",
     "what": "stock signpost phrase"
    }
   ],
   "not_a_ban_on": "Saying \"honestly\" once in a casual reply stays fine.",
   "people_60d": 28,
   "last_seen": "2026-10-04",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#opener"
  },
  {
   "key": "claudish",
   "name": "Quietly and pet metaphors",
   "applies_to": "writing",
   "instruction": "Drop \"quietly\" unless something really happens without notice, and put no stand-in like \"silently\" in its place. Explain plain ideas in plain words, keep a metaphor only when it holds up on a second read, and describe a new idea plainly instead of giving it a coined name you never define.",
   "substitutes": [
    "silently"
   ],
   "checks": [
    {
     "target": "text",
     "regex": "\\bquietly\\b",
     "flags": "i",
     "what": "the word \"quietly\""
    },
    {
     "target": "text",
     "regex": "\\b(?:gremlins?|goblins?|raccoons?|Victorian|load-bearing|smell(?:s|ed)? (?:of|like) ozone)\\b",
     "flags": "i",
     "what": "pet image from the rotation"
    }
   ],
   "not_a_ban_on": "A metaphor that fits and survives a close read stays fine.",
   "people_60d": 28,
   "last_seen": "2026-10-05",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#claudish"
  },
  {
   "key": "empty",
   "name": "Fluent but says nothing",
   "applies_to": "writing",
   "instruction": "Make every paragraph carry at least one concrete thing the reader can check, such as a name, number, example or quote from the source, and cut sentences that only restate the prompt. End on the last real point instead of a sweeping claim the paragraph does not support.",
   "substitutes": [],
   "checks": [],
   "not_a_ban_on": "Clean grammar and tidy structure stay fine when the content is specific.",
   "people_60d": 19,
   "last_seen": "2026-09-30",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#empty"
  },
  {
   "key": "punct",
   "name": "Colon labels and arrows",
   "applies_to": "writing",
   "instruction": "Put the point in the sentence itself instead of a lead-in phrase and a colon such as \"Here's the problem:\", and keep colons for lists and clock times. Write the link in words such as \"then\" or \"leads to\" instead of typing a \"→\" arrow.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "→",
     "flags": "",
     "what": "typed arrow"
    },
    {
     "target": "text",
     "regex": "\\b(?:here[’']s (?:the (?:problem|thing|catch|deal|truth|kicker)|what|why|how)|at its core,? (?:it[’']s|this is) simple|the (?:problem|truth|catch|reality|bottom line) is):",
     "flags": "i",
     "what": "dramatic colon lead-in"
    }
   ],
   "not_a_ban_on": "Semicolons and the Oxford comma stay fine because commenters say ChatGPT seldom uses semicolons.",
   "people_60d": 17,
   "last_seen": "2026-09-25",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#punct"
  },
  {
   "key": "closer",
   "name": "The tidy landing",
   "applies_to": "writing",
   "instruction": "End each paragraph on its last piece of information instead of a line that sums it up, and stop the reply when the answer is done. Leave out follow-up offers such as \"If you want, I can...\" and any closing verdict or moral the user did not ask for.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "(?:\\bif you(?:[’']d like| want)\\b[^.\\n]{0,30}\\bI can\\b|\\bwould you like me to\\b|\\bwant me to\\b[^.\\n]{0,60}\\?)",
     "flags": "i",
     "what": "follow-up offer"
    },
    {
     "target": "text",
     "regex": "(?m)^(?:\\*\\*)?(?:In (?:summary|conclusion)|(?:The )?bottom line|TL;DR)\\b",
     "flags": "i",
     "what": "conclusion label"
    }
   ],
   "not_a_ban_on": "A closing line stays fine when it adds new information.",
   "people_60d": 16,
   "last_seen": "2026-10-04",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#closer"
  },
  {
   "key": "three",
   "name": "Everything in threes",
   "applies_to": "writing",
   "instruction": "Give as many items as the content really has and drop a third adjective or example that only repeats the first two. Allow at most one list of three per page and do not stack sentences that open with the same word.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "(?:^|[.!?]\\s+)(\\w+)\\b[^.!?\\n]*[.!?]\\s+\\1\\b[^.!?\\n]*[.!?]\\s+\\1\\b",
     "flags": "i",
     "what": "repeated sentence opening",
     "min": 2
    },
    {
     "target": "text",
     "regex": "\\b\\w+(?: \\w+)?, \\w+(?: \\w+)?,? (?:and|or) \\w+\\b[^\\n]*\\b\\w+(?: \\w+)?, \\w+(?: \\w+)?,? (?:and|or) \\w+\\b",
     "flags": "",
     "what": "two lists of three together",
     "min": 2
    }
   ],
   "not_a_ban_on": "A single list of three with real content stays fine.",
   "people_60d": 13,
   "last_seen": "2026-09-25",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#three"
  },
  {
   "key": "verbose",
   "name": "Padded, long answers",
   "applies_to": "writing",
   "instruction": "Put the direct answer in the first sentence and match the length to the question, so a yes-or-no question gets a short reply. Skip the restated question and the closing recap, and when asked to shorten a text return fewer words than you were given.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "\\A\\s*(?:great question|good question|sure thing|absolutely|certainly)\\b",
     "flags": "i",
     "what": "praise or assent opener"
    }
   ],
   "not_a_ban_on": "Long answers stay fine when the question needs the detail.",
   "people_60d": 9,
   "last_seen": "2026-09-19",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#verbose"
  },
  {
   "key": "hedge",
   "name": "Hedged, never committed",
   "applies_to": "writing",
   "instruction": "Take a position and state it plainly, qualifying a claim only where the evidence is uncertain and saying where. Answer what the user said instead of correcting points they did not make, and keep your answer in the last paragraph as it was.",
   "substitutes": [],
   "checks": [
    {
     "target": "text",
     "regex": "\\b(?:could|might|may) potentially\\b",
     "flags": "i",
     "what": "stacked qualifier"
    }
   ],
   "not_a_ban_on": "First person hedges like \"I find it odd\" stay fine.",
   "people_60d": 5,
   "last_seen": "2026-10-02",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#hedge"
  },
  {
   "key": "flawless",
   "name": "Too clean to be human",
   "applies_to": "writing",
   "instruction": "Match the register of the setting so a casual post reads casual, with the punctuation a person would type there. Do not add typos to look human, since commenters say typos do not hide AI text.",
   "substitutes": [],
   "checks": [],
   "not_a_ban_on": "Correct spelling and grammar stay fine.",
   "people_60d": 4,
   "last_seen": "2026-09-25",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#flawless"
  },
  {
   "key": "hero",
   "name": "One layout, new paint",
   "applies_to": "web_ui",
   "instruction": "When asked for several designs, vary the structure itself such as grid and section order, and derive the layout from the product instead of a sidebar dashboard or a centred hero by default. Cut extra caption text and tiny explanatory labels.",
   "substitutes": [],
   "checks": [],
   "not_a_ban_on": "A hero section stays fine when the page needs one.",
   "people_60d": 9,
   "last_seen": "2026-09-29",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#hero"
  },
  {
   "key": "purple",
   "name": "Gradients, glow and purple",
   "applies_to": "web_ui",
   "instruction": "Give buttons and backgrounds flat fills from a palette picked for the brand, and keep any gradient to a single spot. Do not default to indigo or purple-blue accents or to glowing card borders on a dark navy page.",
   "substitutes": [],
   "checks": [
    {
     "target": "css",
     "regex": "(?:linear|radial|conic)-gradient\\(",
     "flags": "i",
     "what": "gradient fill"
    },
    {
     "target": "css",
     "regex": "#(?:[4-9a-c][0-9a-f])(?:[0-6][0-9a-f])(?:[c-f][0-9a-f])\\b",
     "flags": "i",
     "what": "purple or indigo hex"
    },
    {
     "target": "html",
     "regex": "\\b(?:bg-gradient-to-\\w+|(?:from|via|to|bg|text)-(?:indigo|violet|purple)-\\d{2,3})\\b",
     "flags": "",
     "what": "Tailwind purple or gradient class"
    }
   ],
   "not_a_ban_on": "A purple brand colour or one gradient stays fine when the brand calls for it.",
   "people_60d": 7,
   "last_seen": "2026-10-02",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#purple"
  },
  {
   "key": "fonts",
   "name": "Same fonts on every page",
   "applies_to": "web_ui",
   "instruction": "Choose a type pairing for this brand and brief instead of the default set, and keep one family per role with consistent weights. Do not set an italic accent word in the headline or use monospace for labels and numbers unless the brand calls for it.",
   "substitutes": [],
   "checks": [
    {
     "target": "css",
     "regex": "font-family:\\s*[\\\"']?Inter\\b",
     "flags": "i",
     "what": "Inter as the main font"
    },
    {
     "target": "html",
     "regex": "(?s)<h1\\b[^>]*>(?:(?!</h1>).)*<(?:em|i)\\b",
     "flags": "i",
     "what": "italic word in headline"
    }
   ],
   "not_a_ban_on": "Inter and other popular sans faces stay fine when chosen for the brief.",
   "people_60d": 6,
   "last_seen": "2026-10-02",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#fonts"
  },
  {
   "key": "pills",
   "name": "Card and pill spam",
   "applies_to": "web_ui",
   "instruction": "Use one small corner radius scale across the page and save fully rounded pills for real tags or toggles. Show a status badge only where the status changes what the user does, and do not give every block its own title with a description.",
   "substitutes": [],
   "checks": [
    {
     "target": "css",
     "regex": "border-radius:\\s*(?:(?:1[6-9]|[2-9]\\d)px|(?:1\\.[5-9]|[2-9](?:\\.\\d+)?)rem)",
     "flags": "i",
     "what": "large corner radius"
    },
    {
     "target": "html",
     "regex": "class=\\\"[^\\\"]*\\b(?:badge|pill|chip)s?\\b",
     "flags": "i",
     "what": "pill or badge markup"
    },
    {
     "target": "css",
     "regex": "border-left:\\s*[3-6]px solid",
     "flags": "i",
     "what": "coloured side border"
    }
   ],
   "not_a_ban_on": "Rounded cards stay fine on their own, since commenters call them common SaaS style.",
   "people_60d": 4,
   "last_seen": "2026-09-24",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#pills"
  },
  {
   "key": "glass",
   "name": "Glassy dark dashboard",
   "applies_to": "web_ui",
   "instruction": "Give panels solid fills with plain borders and keep blur or glow for a real layer such as a modal. Keep shadows off logos and flat elements and do not default to a dark theme with glowing borders.",
   "substitutes": [],
   "checks": [
    {
     "target": "css",
     "regex": "backdrop-filter:\\s*blur",
     "flags": "i",
     "what": "frosted glass panel"
    },
    {
     "target": "css",
     "regex": "box-shadow:[^;]*\\b0 0 \\d{2,}px",
     "flags": "i",
     "what": "glow around an element"
    },
    {
     "target": "css",
     "regex": "rgba\\(\\s*255\\s*,\\s*255\\s*,\\s*255\\s*,\\s*0?\\.\\d+\\s*\\)",
     "flags": "i",
     "what": "translucent white fill"
    }
   ],
   "not_a_ban_on": "One glass panel stays fine, since commenters call the style overused and not bad.",
   "people_60d": 4,
   "last_seen": "2026-09-18",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#glass"
  },
  {
   "key": "cards",
   "name": "Cards inside cards",
   "applies_to": "web_ui",
   "instruction": "Separate sections with spacing and headings, and box content in a card only when it is one item in a collection, never a card inside another card. Leave pill badges off items that need no status and drop subtitles that explain obvious functions.",
   "substitutes": [],
   "checks": [
    {
     "target": "html",
     "regex": "class=\\\"[^\\\"]*\\b(?:card|rounded-(?:xl|2xl|3xl))\\b[^\\\"]*\\\"[^<]*(?:<(?!/)[^>]*>[^<]*){0,4}<[^>]*class=\\\"[^\\\"]*\\b(?:card|rounded-(?:xl|2xl|3xl))\\b",
     "flags": "",
     "what": "card inside a card"
    }
   ],
   "not_a_ban_on": "Cards for a grid of similar items stay fine.",
   "people_60d": 3,
   "last_seen": "2026-10-01",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#cards"
  },
  {
   "key": "kit",
   "name": "Stock Tailwind kit",
   "applies_to": "web_ui",
   "instruction": "Set a brand palette and spacing scale as design tokens before building, and restyle library components such as shadcn to match them instead of shipping defaults. Use icons only where they help a label and check that small parts like select arrows sit aligned with enough padding.",
   "substitutes": [],
   "checks": [
    {
     "target": "html",
     "regex": "\\b(?:bg|text|border)-(?:indigo|slate|gray|blue)-(?:50|[1-9]00|950)\\b",
     "flags": "",
     "what": "stock Tailwind colour class"
    }
   ],
   "not_a_ban_on": "Tailwind and shadcn stay fine as a base when styled for the brand.",
   "people_60d": 3,
   "last_seen": "2026-09-28",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#kit"
  },
  {
   "key": "dark",
   "name": "Dark glowing default UI",
   "applies_to": "web_ui",
   "instruction": "Start from a light theme unless the brief asks for dark, and pick an accent from the brand instead of purple-blue gradients and glows. Skip the eyebrow label above each heading and the hover lift on every card.",
   "substitutes": [],
   "checks": [
    {
     "target": "css",
     "regex": ":hover[^{]*\\{[^}]*translateY\\(\\s*-",
     "flags": "i",
     "what": "hover lift on cards"
    },
    {
     "target": "css",
     "regex": "text-transform:\\s*uppercase[^}]*letter-spacing|letter-spacing[^}]*text-transform:\\s*uppercase",
     "flags": "i",
     "what": "spaced uppercase eyebrow label"
    },
    {
     "target": "css",
     "regex": "background(?:-color)?:\\s*#(?:0[0-9a-f]|1[0-9a-f])(?:[0-2][0-9a-f]){2}\\b",
     "flags": "i",
     "what": "near black page background"
    }
   ],
   "not_a_ban_on": "A dark theme stays fine when the brief asks for one.",
   "people_60d": 2,
   "last_seen": "2026-09-14",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#dark"
  },
  {
   "key": "icons",
   "name": "Safe template deck",
   "applies_to": "slides",
   "instruction": "Give each slide one message and a layout that fits it so text size and structure change between slides, and build on the user's slide master when one is given. When given a branded example, adapt its style to the new content instead of copying the document.",
   "substitutes": [],
   "checks": [],
   "not_a_ban_on": "Icons are not what commenters object to.",
   "people_60d": 6,
   "last_seen": "2026-09-07",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#icons"
  },
  {
   "key": "comments",
   "name": "Narrating, jargon-heavy comments",
   "applies_to": "code",
   "instruction": "Write comments that explain what the code does or why in plain words, and leave out notes about what was just changed or what the user asked for. Do not reword existing comments that the task does not touch.",
   "substitutes": [],
   "checks": [
    {
     "target": "code",
     "regex": "(?:#|//)[^\\n]*\\b(?:now (?:that|we|it|returns|uses|handles)|has been (?:updated|changed|modified|fixed)|(?:was|were) (?:changed|updated) to|as (?:you )?requested|I (?:changed|added|updated|renamed))\\b",
     "flags": "i",
     "what": "changelog comment"
    },
    {
     "target": "code",
     "regex": "(?:#|//|\\*)[^\\n]*\\bdesign intent\\b",
     "flags": "i",
     "what": "design intent comment"
    }
   ],
   "not_a_ban_on": "Short comments that explain why a line exists stay welcome.",
   "people_60d": 13,
   "last_seen": "2026-10-02",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#comments"
  },
  {
   "key": "commit",
   "name": "Thin, tidy commits",
   "applies_to": "code",
   "instruction": "Follow the repository's commit style and every commit rule you were given, letter case included. Add a body that says what changed and why when the change is more than trivial, and keep the README written for users without working notes.",
   "substitutes": [],
   "checks": [
    {
     "target": "commit",
     "regex": "\\A[^\\n]{1,50}\\n?\\Z",
     "flags": "",
     "what": "one line commit message"
    }
   ],
   "not_a_ban_on": "",
   "people_60d": 5,
   "last_seen": "2026-10-02",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#commit"
  },
  {
   "key": "defensive",
   "name": "Fallbacks everywhere",
   "applies_to": "code",
   "instruction": "Read a value under the one name it has and let a missing or null value raise a clear error, unless the user asks for graceful handling. Remove old names and compatibility paths in new code instead of keeping them beside the new ones, and never fill missing data with placeholders or zeros.",
   "substitutes": [],
   "checks": [
    {
     "target": "code",
     "regex": "\\.(?:get|value)\\(\\s*[\\\"'][^\\\"']+[\\\"']\\s*,\\s*[\\w.]*\\.(?:get|value)\\(",
     "flags": "",
     "what": "nested fallback key lookup"
    },
    {
     "target": "code",
     "regex": "\\.get\\([^)]*\\)\\s*(?:or|\\|\\||\\?\\?)\\s*[\\w.]+\\.get\\(|\\?\\?[^;\\n]*\\?\\?",
     "flags": "",
     "what": "chained alias fallbacks"
    },
    {
     "target": "code",
     "regex": "(?m)^\\s*if\\s*\\(?\\s*(?:not\\s+[\\w.]+|![\\w.]+|[\\w.]+\\s*(?:===?|is)\\s*(?:null|None|undefined))\\s*\\)?\\s*:?\\s*\\{?\\s*return\\s*(?:None|null)?\\s*;?\\s*\\}?\\s*$",
     "flags": "",
     "what": "null check that returns"
    }
   ],
   "not_a_ban_on": "Defensive handling stays fine in production code where the user wants it.",
   "people_60d": 3,
   "last_seen": "2026-09-26",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#defensive"
  },
  {
   "key": "naming",
   "name": "Layered names, unasked renames",
   "applies_to": "code",
   "instruction": "Name things after what they do in the domain and add a Runtime, Worker, Registry or Store layer only when it has its own job. Leave existing names and comments outside the task as they are, and follow the naming already in the repo.",
   "substitutes": [],
   "checks": [
    {
     "target": "code",
     "regex": "\\b\\w*(?:Runtime|Runner|Registry|Store|Worker)(?:Runtime|Runner|Registry|Store|Worker)\\b",
     "flags": "",
     "what": "stacked layer noun name"
    },
    {
     "target": "code",
     "regex": "\\b(?:FORGE|NEXUS|HIVE|SOVEREIGN|ATLAS|ORACLE)\\b",
     "flags": "",
     "what": "mythic capitals project name"
    }
   ],
   "not_a_ban_on": "Clean names that document themselves stay fine.",
   "people_60d": 3,
   "last_seen": "2026-10-01",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#naming"
  },
  {
   "key": "ascii",
   "name": "Em dashes around the code",
   "applies_to": "code",
   "instruction": "In READMEs and code comments, join clauses with a comma or a full stop where a \"—\" would go. Rewrite the sentence when you remove a dash instead of swapping in \" -- \".",
   "substitutes": [
    "--"
   ],
   "checks": [
    {
     "target": "code",
     "regex": "—",
     "flags": "",
     "what": "em dash in project text"
    },
    {
     "target": "code",
     "regex": "(?:#|//|/\\*|^\\s*\\*)[^\\n]*\\s--\\s",
     "flags": "",
     "what": "double hyphen in a comment"
    }
   ],
   "not_a_ban_on": "Triple quoted docstrings are normal Python and stay fine.",
   "people_60d": 2,
   "last_seen": "2026-09-13",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#ascii"
  },
  {
   "key": "bugs",
   "name": "Clean code, hidden holes",
   "applies_to": "code",
   "instruction": "Use only parameters you can confirm in the installed version of a library, and say so when you are unsure of an API that changes often. Make a failed auth check stop the request and read secrets from the environment instead of source files.",
   "substitutes": [],
   "checks": [
    {
     "target": "code",
     "regex": "(?:api[_-]?key|secret|token|password)\\s*[:=]\\s*[\\\"'][A-Za-z0-9_\\-]{12,}[\\\"']",
     "flags": "i",
     "what": "hardcoded secret value"
    },
    {
     "target": "code",
     "regex": "console\\.(?:log|warn|error)\\([^)]*(?:auth|token|unauthori)[^)]*\\)\\s*;?\\s*next\\(\\)",
     "flags": "i",
     "what": "failed auth passed on"
    },
    {
     "target": "code",
     "regex": "(?:execute|query)\\(\\s*(?:f[\\\"'][^\\\"']*\\b(?:SELECT|INSERT|UPDATE|DELETE)\\b[^\\\"']*\\{|[\\\"'][^\\\"']*\\b(?:SELECT|INSERT|UPDATE|DELETE)\\b[^\\\"']*[\\\"']\\s*\\+|`[^`]*\\b(?:SELECT|INSERT|UPDATE|DELETE)\\b[^`]*\\$\\{)",
     "flags": "i",
     "what": "SQL built from strings"
    }
   ],
   "not_a_ban_on": "",
   "people_60d": 2,
   "last_seen": "2026-09-07",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#bugs"
  },
  {
   "key": "dup",
   "name": "Duplicates instead of reusing",
   "applies_to": "code",
   "instruction": "Search the codebase for an existing helper before writing a new one and move repeated code into one shared function. Replace the old parameter or method when you add a new one, and split very large files by concern.",
   "substitutes": [],
   "checks": [],
   "not_a_ban_on": "",
   "people_60d": 2,
   "last_seen": "2026-08-15",
   "card_url": "https://machinemorning.com/giveaway/chatgpt.html#dup"
  }
 ],
 "changes": [
  {
   "date": "2026-10-04",
   "added": [],
   "removed": [],
   "first": true
  },
  {
   "date": "2026-10-05",
   "added": [
    "Fallbacks everywhere"
   ],
   "removed": [],
   "first": false
  }
 ]
}