Very nice!
In a related vein, I have an Analysis that creates some properties using the RelayChain text files that are generated on the client. While the client's 'Relay' property reflects the relay name as it appears on the client, the results in the RelayChain file reflect both the Relay's computername (as it reports itself), and the relay's Computer ID. In my experience, the RelayChain reports are correct regardless of DNS games, NAT translations, fake-root / last-fallback-relay, etc.
I think in most cases one would only care to keep one or two of these properties, but once I get started sometimes it's hard to stop.
Most Recent Registration Information
/* filename/date, time, Success/Failure, Server, Relay Path, Client */ (tuple string item 0 of it, following text of first " " of tuple string item 1 of it, tuple string item 2 of it, tuple string item 3 of it | "none", unique value of concatenation of tuple string items whose (it starts with "r:") of it | "none", tuple string item (number of tuple string items of it - 1) of it ) of (tuple string of (name of it; substrings separated by " - " of lines (maximum of line numbers of lines of it) of it)) of items 0 of (files of it, maximum of modification times of files of it) whose (modification time of item 0 of it = item 1 of it) of folders "RelayChain" of folders "__Global" of data folders of clients
Most Recent Registration Attempt
following text of last "|" of preceding text of last "|" of ("|" & it & "|") of concatenation "|" of (item 0 of it & "::" & item 1 of it) of ( name of it, lines of it) of files of folders "RelayChain" of folders "__Global" of data folders of clients
Most Recent Registration Success
(following text of last "|" of preceding text of last " - S - " of it | "NoSuccess", preceding text of first "|" of following text of last " - S - " of it|"NoSuccesses") of ("|" & it & "|") of concatenation "|" of (item 0 of it & "::" & item 1 of it) of ( name of it, lines of it) of files of folders "RelayChain" of folders "__Global" of data folders of clients
Most Recent Registration Failure
(following text of last "|" of preceding text of last " - F - " of it | "NoFail", preceding text of first "|" of following text of last " - F - " of it|"NoFailures" ) of ("|" & it & "|") of concatenation "|" of (item 0 of it & "::" & item 1 of it) of ( name of it, lines of it) of files of folders "RelayChain" of folders "__Global" of data folders of clients
Most Recent Relay Chain
tuple string of tuple string items whose (it starts with "r:" or it starts with "s:") of tuple string of substrings separated by " - " of following text of last "|||" of ("|||" & it ) of concatenation "|||" of lines containing " - S - " of files of folders "RelayChain" of folders "__Global" of data folders of clients
Relay Chain: Direct Parent Relay
tuple string items (number of tuple string items of it - 1) of tuple string of tuple string items whose (it starts with "r:" or it starts with "s:") of tuple string of substrings separated by " - " of following text of last "|||" of ("|||" & it ) of concatenation "|||" of lines containing " - S - " of files of folders "RelayChain" of folders "__Global" of data folders of clients
Relay Chain: Ancestor Relays
tuple string items (integers in (0, number of tuple string items of it - 2)) of tuple string of tuple string items whose (it starts with "r:" or it starts with "s:") of tuple string of substrings separated by " - " of following text of last "|||" of ("|||" & it ) of concatenation "|||" of lines containing " - S - " of files of folders "RelayChain" of folders "__Global" of data folders of clients
edit: these concatenate together all the lines of all the RelayChain files, to cover an edge case that occurs after midnight rollover, where the current registration is in yesterday's file because a new selection has not yet occurred today. The relevance to join these lines is quite performant so it wasn't really worth it to me to limit to just the yesterday and today's files.