Changes touching this path
- the shipper stops being able to ingest without a classifier, and the requirement is the mechanism rather than a note on a ticket: a row can NEVER be reclassified, because 1620 keeps no raw user agent so a later rule cannot revisit it - revisability is bought with provenance and not evidence, and history is never restated. so every row ingested before the shared classify module exists is permanently unjudged, and 1625 default view of class not in bot or internal would count that whole era of bot traffic as ordinary visitors, forever, with nothing in the data saying so.
waiting costs NO data and that is what settles it: the logs are retained 30 days, so the bytes sit on disk either way. shipping early does not gain data, it converts recoverable data into rows nobody can ever classify. the type makes omission a compile error and the runtime check makes it an error for a caller that is not typescript, because this guard has to survive the bundler, the entry point, and whoever wires it up months from now - and the refusal says why waiting is free rather than only that it refused, since a message that explains the cost is the difference between someone fixing it and someone deleting the check.
the boundary tests pass a real classifier through one helper rather than each supplying its own, so the requirement is stated once and those tests stay about what they are about. two new assertions cover the refusal and its reasoning, both proved red by disabling the guard. this lands the collector core complete and DORMANT: no timer is installed, so nothing runs, and 1756 stays open deliberately rather than being closed over something that does not execute (#1756)
c2f0bc87 · dbf3dbe6…
Renames are not followed. loot's tree maps a path to an address, so a rename is a delete and an add. This list is the history of the name, not of the bytes.