fail2ban's Lesson for Agents — Vivian Voss
On 10 August 2024 Debian bug 1078208 reported that the fail2ban SSH filter no longer worked with OpenSSH 9.8: part of the daemon had moved into a process called sshd-session, and with the changed name on its log lines the patterns stopped matching without reporting any error. Text has been the universal interface since Doug McIlroy wrote in 1978 that the output of every program should be expected to become the input to another, and it works between people and machines because the person at the keyboard notices when a sentence changes. fail2ban removed that person long ago, and on FreeBSD 15 its sshd filter carries 27 regular expressions where the first sshd support in October 2004 matched two phrases. Agent pipelines rebuild the same arrangement with models, one writing prose and another interpreting it, with no agreement about the words. A UC Berkeley team annotated 1,642 traces from seven multi-agent frameworks for NeurIPS 2025 and found task failure rates between 41 and 86.7 per cent, with 32.3 per cent of failures attributed to inter-agent misalignment. OpenAI reported in August 2024 that gpt-4-0613 followed a complex JSON schema less than 40 per cent of the time when asked, against 100 per cent once the platform enforced it. The strongest objection is granted in full: natural language is why these systems compose at all, and many teams already use structured outputs and the Model Context Protocol. The FreeBSD base system met a version of the problem earlier with libxo, which first appeared in FreeBSD 11.0 and lets 25 base programs print text for people and JSON for programs from the same code, while jc needs 220 parsers in 57,683 lines of Python to convert output after the fact. The limit starts at home: ifconfig does not speak libxo, and jc parses it with 728 lines and 31 regular expressions.