--- /dev/null
+# Detail file reader
+
+## What works
+
+proto_detail and proto_detail_file can work together to read a
+pre-existing `detail.work` file, process it to completion, and close
+the file.
+
+The detail listener can be configured to read Accounting-Request,
+CoA-Request, or Disconnect-Request packets.
+
+The detail file listener can programmattically set priorities for the
+packets.
+
+Event-Timestamp and Acct-Delay-Time are set for accounting packets.
+
+Use `MPRINT` to debug the file reading.
+
+Basic sanity checks of the file format is done.
+
+Once a `read()` returns data AND at least one packet, the FD is paused
+until all of the `write()` functions return. This allows the detail
+file reader to be "self clocked". i.e. if the server isn't busy, the
+file is read at 100% speed. If the server is busy, the file is read
+only when it becomes un-busy enough to respond to the packets.
+
+The packets are processed through `recv {}` and `send {}` sections.
+Note no second name!
+
+The `send Do-Not-Respond { }` section should work.
+
+The default packet size is 64K. If detail file entries are larger
+than this, you will have to set `max_packet_size` to something larger.
+Otherwise, larger packets are skipped.
+
+## What doesn't work
+
+The `send Protocol-Error { }` section is there, but doesn't work.
+
+The "self clocking" has some limitations. Right now, it reads
+`max_packet_size` data from the file, and adds *all* packets in the
+file. So it's somewhat bursty. It would be nice to read one packet,
+process it, and then read another only when the first one is done.
+
+The issue with that is the event loop is FD based. There's no way
+right now to determine that the FD may not be ready, but there's still
+more data in the `fr_network_socket_t` structure. Fixing that
+requires the network code to track sockets which have partial data,
+but are paused.
+
+The code hasn't been tested with very large detail files.
+
+"too large" packets haven't been tested well.
+
+The "Done" packets haven't been tested well.
+
+The read_pause / read_continue hasn't been tested with large detail
+files.
+
+The polling for detail files hasn't been written. No `glob()`, rename
+"detail_foo` to `detail.work`, no locking of the detail file.
+
+The VNODE work hasn't been started. That's the code which will open a
+EVFILT_VNODE with NOTE_EXTEND on the directory. Then, once it gets a
+signal, either open `detail.work`, or call `glob()` to find the oldest
+detail file, rename it to `detail.work`, and process that. With
+locking, etc.
+
+We still have to figure out how to open a locked file from
+`proto_detail_file`, probably via having the parent open the file,
+lock it, and (somehow) create the child, and pass the opened FD to the
+child.
+
+When the child is done, it should notify the parent VNODE handler that
+the file is done, so that the parent can troll through the directory
+again. Or maybe we can just delete the file, and rely on the parent
+to get a NOTE_EXTEND signal, and then realize that there's no
+"detail.work" file, and process that? ... that's probably the simplest
+TBH. That way the parent and child can have no real relationship
+
+The VNODE handler needs to minimize trolling through the directory, so
+that it doesn't do so on every file creation. i.e. it should troll
+through once, do the detail.work thing, remember there's a
+detail.work... and then when it gets NOTE_EXTEND, only check that
+there's a detail.work. If it can't stat the detail.work file, it
+needs to troll through the directory again. Otherwise, the
+detail.work reader is still busy, and the VNODE routine can ignore the
+signal.
+
+There's no documentation in `raddb/sites-available`.
+
+We should have examples of calling other virtual servers:
+
+ recv {
+ call default.Accounting-Request {
+ ...
+ }
+ }
+
+Tho that configuration should be discouraged, as it can result in the
+packets being written to the detail file again. In v4 rlm_detail,
+there is no logic to suppress that kind of configuration.
+
+## Ideas
+
+allow for multiple detail.work files, (detail.work1, detail.work2,
+etc). The VNODE handler can then spawn multiple children, allowing
+for very fast reading of detail files!