Arrays are where schema generators go wrong, and it is worth knowing how. Given [{"a":1,"b":2},{"a":3}] the common implementations either describe only the first element — so "b" comes out required, and the schema rejects data that is perfectly valid — or union the two into an anyOf that is technically correct and unreadable. Here the element schemas are merged structurally: properties are unioned and `required` is the intersection, so "a" is required and "b" is not. That is the only description of the sample that every element in it actually satisfies.
Numbers are split into integer and number rather than flattened, because a sample of whole numbers tells you something a "number" does not. An array mixing the two widens to number, which is the correct generalisation; two genuinely different types produce an anyOf, which is honest about the fact that they are different. Strings are checked against the common formats — date-time, date, time, email, uuid, uri, ipv4 — in a defined order so a timestamp is never read as a plain date.
An empty array leaves `items` off entirely rather than guessing, because an empty array carries no information about what it would hold. That is the general caveat too, and it is attached to every result: a schema inferred from one sample describes that sample. Optional fields the sample happens to include come out required, and anything it never shows cannot be known about at all. It is a starting point to edit, not a specification.