aboutsummaryrefslogtreecommitdiffstats
path: root/AGENTS.md
AgeCommit message (Collapse)AuthorFilesLines
26 hoursdocs: record the real-mail sweep and open a backlogDanilo M.1-0/+38
A synthetic fixture only ever holds the shapes someone thought of, and the shapes nobody thought of are the ones that leak. Sweeping the user's own tag:spam is the only source of those, and it earned its place: the first message found a header the parser did not read, and the corpus exercised a spoofed Reply-To display name no fixture had. AGENTS.md records it under Testing, beside the fixture rule it is the deliberate exception to: ask first, work from the scratchpad, compare every address in the raw source against the whole ioc output, and let only counts and stripped domains out. A finding becomes a synthetic fixture; the real message never enters the repository. BACKLOG.md opens with the one thing the sweep found that was not worth fixing blind: boilerplate namespace urls (w3.org doctypes) reported as indicators. Noise rather than a defect, and the argument for leaving it alone is real, so it is written down with both sides rather than built. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019NHaqA1Rz5ybed7wFUeQbK
27 hoursdocs: AGENTS.md, with CLAUDE.md pointing at itDanilo M.1-0/+251
Same arrangement as qtmaildir: one source of truth, and a thin pointer beside it so every agent tool reads the same file. It leads with the three properties that are not negotiable, because each has a concrete victim and each is a thing a later change could quietly break. Recipient identifiers must never reach a report, and the guarantee is structural rather than a step someone remembers. Nothing is fetched or resolved, which the suite verifies by running with sockets disabled. The trust boundary is configured rather than guessed, and its test is mutation-checked because walking one hop too far reports an innocent party the attacker named. It also records the traps that were found the hard way rather than reasoned about: ipaddress.ip_network(42) returning 0.0.0.42/32 instead of raising, a string trusted_relays iterating characters, goog.json looking like the right SPF source while listing all of Google, and the provider table having been wrong in every entry when it was first written from memory. The hand-testing rule is stated with its evidence: the prompts are the user's to test, and one pass over them found five defects, four being the same mistake of validating an answer somewhere other than where it was given. Every factual claim in it was checked against the code before committing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KphFXTc2QajxXsHWyvGJ4R