Area: Monetization (audit p10) · Surface: GET /series, GET /series/{slug}, GET/POST /admin/editorial/series/* · Dimension: dead-code · Severity: enhancement
The entire editorial-series feature (public SeriesController + the series* CRUD methods on AdminEditorialController + the EditorialSeries model + 4 templates) hangs off the `editorial_series` flag, which is on POLICY_DISABLED in FeatureCatalog.php (line 74). These keys never auto-enable for any tenant, so the public /series surface 404s and the admin series UI is unreachable through gated nav on every production tenant. Reporting strictly as a removal candidate (policy-disabled), NOT an orphaned/broken-route bug — the code is wired correctly and intentionally off. One nuance: the public SeriesController gates in its constructor, but the AdminEditorialController series methods only requireRole(4) and do NOT call features->require('editorial_series'), so a root admin could still reach the admin series CRUD by direct URL even though the public surface 404s.
Evidence
`editorial_series` is in POLICY_DISABLED — grep platform-admin/src/Domain/FeatureCatalog.php:
74: 'editorial_series',
(catalog row at line 165, group 'retro-games', default false).
Public SeriesController hard-requires the flag in its constructor (platform/src/Controllers/SeriesController.php:30):
$this->features->require('editorial_series');
// lines 27-29: "Every action in this controller is gated by the editorial_series feature flag. When off, direct-URL hits 404..."
Routes depending on it (platform/src/routes.php):
444: $router->get('/series', 'SeriesController@index');
445: $router->get('/series/{slug}', 'SeriesController@show');
1539: $router->get ('/editorial/series', 'AdminEditorialController@seriesIndex');
1541: $router->post('/editorial/series', 'AdminEditorialController@seriesStore');
1546: $router->post('/editorial/series/{slug}/add-chapters', 'AdminEditorialController@seriesAddChapters');
(plus seriesCreate/seriesEdit/seriesUpdate/seriesDelete/seriesUndelete, lines 1540-1545)
Templates only rendered for this surface (each exactly 1 render ref): templates/series/index.php, templates/series/show.php, templates/admin/editorial/series/index.php, templates/admin/editorial/series/form.php.
Suggested fix. If editorial_series is permanently off-limits (it has been on POLICY_DISABLED since the 2026-05 retro-games purge), consider deleting SeriesController, the series* methods on AdminEditorialController, the EditorialSeries model, and templates/series/* + templates/admin/editorial/series/* to remove dead surface area. If kept for future use, leave as-is (the documented purpose of POLICY_DISABLED). No action required for correctness.
Filed by the automated tenant-app audit and adversarially evidence-verified. Status: verified. Open — not yet actioned.
Patrick Bass
@mobieus