A Unicode space killed my cron for 2.5 hours A Python cron job on Windows failed for 2.5 hours due to a single Unicode character (U+202F, narrow no-break space) in an email body. The character caused a UnicodeEncodeError when the script tried to print it to a Windows console with cp1252 encoding, killing the process before any logging or error handling could occur. The bug went undetected because the test suite uses UTF-8 encoding and ASCII fixtures, and the failure mode is invisible to standard monitoring. My cron job died for two and a half hours on June 16. Nothing logged. No exception trace anywhere. The only thing that noticed was another cron job, and it noticed because a file's modification time had stopped moving. The killer was one character: U+202F, a NARROW NO-BREAK SPACE. It arrived in the body of a single inbound email — pasted from someone's word processor, typographer whitespace intact. My poller's print statement tried to write it to a Windows console running cp1252, and the whole process died before it could log a single line about why. I want to walk through this one because the bug is small and the failure mode is exactly the kind of thing a test suite will never catch. I run 17 side projects out of a single workspace. Email is one of the inputs. A Python script called imap poller.py runs every 15 minutes from a local cron. It pulls unread mail from a local IMAP cache called VizMail, classifies each message with Claude Haiku, and creates a ticket on the right project's Kanban board. Pass-through senders skip the LLM. Recipient-based routing — when the email is addressed to one of my per-project contact addresses — skips the LLM too. Everything else falls through to Haiku for triage. The poller logs every run to .agents/imap-poller/memory.md . The file has a "Run Log last 20 entries " section that gets appended on each invocation, even when there are no new emails. That self-logging is important. It's not just a debug aid. It is the signal another piece of infrastructure uses to decide whether the poller is alive. The cron line is boring: /15 python C:\workspace\imap poller.py --verbose I run with --verbose because the output gets captured by the cron runner and stored. When something misroutes, I want to see the email subject and the classification decision in the captured log. That decision, running verbose in production, is what made the bug possible. Here is the relevant slice of main before the fix: python def main : parser = argparse.ArgumentParser ... parser.add argument "--verbose", action="store true", ... args = parser.parse args emails = fetch unprocessed emails ... for em in emails: if args.verbose: print f"From: {em.get 'from', em.get 'sender', '' }" print f"Subject: {subject}" body = em.get "body", em.get "text", em.get "snippet", "" print f"Body preview: {str body :200 }" ... At 17:30 UTC, the loop hit an inbound email whose body contained a U+202F. On Linux, this is uneventful. On a Windows console with the default cp1252 codepage, the encoder hits this character and raises: UnicodeEncodeError: 'charmap' codec can't encode character ' ' in position 12: character maps to