A theme reduced to templates and styles, and functionality that moved into a plugin — which is where it belonged.
what left the theme, over three years:
custom post types → a plugin. they survive a
theme switch, which is
the whole argument.
shortcodes → blocks, in a plugin
the REST endpoints → a plugin
the settings screen → deleted
image sizes → a plugin, because the
images outlive the theme
what stayed: templates, parts, patterns, styles, and
forty lines of functions.php.
The rule that fell out is that anything which should survive a theme switch is not the theme’s, and applying it removed almost everything. A custom post type registered by a theme is content that disappears when somebody changes the design, which is a bug waiting for a redesign.