How a DNS change gets described
The difference between a DNS monitor people act on and one they filter is entirely in the wording of the message. A diff is correct and unreadable. A sentence with the consequence in it gets answered in ten seconds.
Key takeaways
- The message names the record, the old value, the new value, and the consequence.
- The consequence comes from a fixed table, not from a model.
- A model is used for one thing: describing an SPF or DMARC change in plain words.
- Additions, modifications and deletions read differently and should.
- A change with no known consequence says so rather than inventing one.
Four lines
What a change message says
- The record. “MX at example.com”
- Was. “10 mail.provider.example”
- Now. “10 mail.oldhost.example”
- Which means. “Incoming mail for example.com now goes to mail.oldhost.example. If that host is not accepting mail, messages will bounce or be lost.”
- Two buttons. “That was me” and “Not me — investigate”.
The fourth line is the one that changes behaviour. A person reading the first three lines has to know what an MX record does to know whether to care; a person reading the fourth does not. And the people most likely to be reading this message at nine on a Tuesday are exactly the people who half-remember.
Consequences come from a table
- App integration
- Machine learning
- Analytics
- Front-end & mobile
Why fixed sentences
An MX change means the same thing every time and the sentence explaining it can be written once, carefully, by somebody who knows what they are talking about. Generating it produces a slightly different sentence each time, occasionally a wrong one, and always a more expensive one.
The consequence table has perhaps a dozen entries and covers the record types where a change has a predictable effect. It is a sheet, so somebody who thinks a sentence is unclear can improve it without touching any code.
Why SPF and DMARC are different
Because the change is inside a string, and the string is genuinely unreadable. “v=spf1 include:_spf.provider.example include:mail.other.example ~all” becoming the same string with one include missing is a diff that a person can see and cannot interpret at a glance.
So those two get one model call, given both strings and asked what the practical difference is: “mail sent through Other Mail Provider will no longer pass SPF.” That is a sentence with a consequence in it, and it is the kind of thing a model is genuinely good at that a lookup table cannot do.
Three shapes of change
- App integration
- Machine learning
- Management
- Analytics
Distinguishing deletion from non-resolution needs the provider API where one exists: a record that is still in the zone but no longer resolving is a delegation problem, and one that has gone from the zone is an edit. Where there is no API, the message says which it cannot tell — “stopped resolving; we cannot see the zone to say whether it was removed” — because that distinction changes who you go and talk to.
Next: the mail records, which get their own post for good reason.
All posts