Eight defects fixed (#8):
fern_form_store()fataled on every call — the API class did not parse (ABSPATH guard betweendeclare()andnamespace)retention_days < 0broke storage instead of disabling the cleanup — a negative value now means "keep submissions forever", the intended way to disable the purgefern:form:configwas unusable from a theme — the config is now resolved on first read, after themes load, instead of being frozen at plugin load- Partial filter returns fataled — returning only the key you care about now falls back to defaults for the rest
- Cleanup loop had no exit when deletions failed, and compared a GMT cutoff against the site-local
post_datecolumn - Admin views showed raw PHP source under
short_open_tag=Off(the php.ini-production default) — short open tags removed uninstall.phpfataled for users who opted intoFERN_CLEAR_ON_DEACTIVATE(autoloader never registered)- Absurd
retention_daysvalues could purge the whole store viastrtotime()overflow — a future cutoff now means "keep everything"
New: standalone regression harness — php tests/run.php (8 scenarios, no framework).
🤖 Generated with Claude Code