This happens in the rewriteTargetListIU function in src/backend/rewrite/rewriteHandler.c. The comment says it all:
/*
* rewriteTargetListIU - rewrite INSERT/UPDATE targetlist into standard form
*
* This has the following responsibilities:
*
* 1. For an INSERT, add tlist entries to compute default values for any
* attributes that have defaults and are not assigned to in the given tlist.
* (We do not insert anything for default-less attributes, however. The
* planner will later insert NULLs for them, but there's no reason to slow
* down rewriter processing with extra tlist nodes.) Also, for both INSERT
* and UPDATE, replace explicit DEFAULT specifications with column default
* expressions.
So this happens during query rewrite, which is the step between parsing the SQL string and optimizing it.
INSERTstatement, some of that code will fill in the missing columns with defaults. There are no triggers involved, or anything else that you might call a "mechanism"; it's just written that way.