On quoting: This is correct behavior, not a bug. quote_identifier quotes any identifier whose keyword category is not UNRESERVED_KEYWORD. insert is UNRESERVED_KEYWORD in PostgreSQL's grammar (it can be used as an identifier without quoting), while integer, interval, and boolean are COL_NAME_KEYWORD — they can only serve as column names in restricted contexts, so they need quoting when used as general identifiers. The table name "int" is quoted for the same reason (int is COL_NAME_KEYWORD). This is identical to what pg_dump and quote_identifier do throughout PostgreSQL.
On owner + except_kinds: Also correct behavior by design. The owner parameter controls whether the ALTER TABLE ... OWNER TO statement is included when the table kind is in scope. OWNER TO is grouped under the table kind intentionally: in a multi-pass workflow (first pass emits CREATE TABLE + constraints, second pass adds only FKs), you don't want OWNER TO re-emitted in the second pass. When you say except_kinds => ARRAY['table'] you are explicitly asking for sub-object DDL only, and ownership is a table-level property. The owner flag says "include ownership if you're emitting table-level DDL"; it doesn't override the kind filter.