Jails have kevent support, with events for set, attach, remove, and child creation. The last one allows for child jails to be automatically added to the vent list via the NOTE_TRACK that was already used by process forking.
Jail descriptors can also easily be tracked via kevent, but have a harder time with child jail tracking because kevent isn't able to open new jail descriptors (as they are process-specific). So something needs to be done to work around this.
Plan B: kevent only returns NOTE_JAIL_CHILD (without an identifier), indicating that a child jail was created. Separately, there is a set of ioctls to automatically add descriptors for child (and further descendant) jails as they are created, and to fetch those descriptors. It's only when the process fetches the descriptor that is actually shows up the process's file table. While it's technically unrelated, the ioctl works together with kevent so new jails can notify and get a descriptor.