# ADR: Domain folder placement for `inc/classes` ## Status Accepted (2026-07-17) ## Context After moving root class files into domain folders, freeze placement for boundary types so later moves are intentional. ## Decision | Concern | Domain | Why | |---------|--------|-----| | Theme shell (setup, scripts, templates, SEO, meta boxes, DB migrator, front-submit, docs presenter, home modules, stats, redirects, update checker, comment actions) | `core/` | Shared CMS plumbing | | SPA shell + controllers + schema + native ops | `admin/` | Dual-surface IA | | Settings facade + runtime delegates | `settings/` | Single public settings API | | Auth, OAuth, captcha, moderation, email rollback | `auth/` | Identity & access | | User center/home/badges/level/metrics/notifications/follow | `user/` | Account surface | | Credits, balance wallet, signin, invite, points-free | `credits/` | Points + cash wallet | | Download tokens/state, content pay, VIP, visibility | `content/` | Post-centric paid content | | Topic pay, plate follow pay | `forum/` | Forum SKUs (not generic content pay) | | Orders, gateways, coupon, charge-card, revenue, creator-revenue, withdrawal, rebate, discount, after-sale, shipping, wechat-notify | `payment/` | Commerce + settlement | | Shop services/meta/reviews | `shop/` | Product catalog / cart | | SMS stack | `sms/` | Messaging channel | | AI runtime (admin AI controller stays in `admin/`) | `ai/` | Generation helpers | | Message, private message, site notice, report center | `messages/` | In-site messaging | | MeiliSearch, search-push, ip-geo, content-audit, api-audit | `extensions/` | Optional integrations | | Widgets + registry | `widgets/` | WP widgets | | Inline style / custom code / loading overlay | `frontend/` | Asset render helpers | ### Rules - Traits live next to owner: `{domain}/{slug}-traits/`. - Loader: manual `require_once` in `inc/bootstrap.php` only; traits before shells. - Do not move `topic-pay` / `plate-follow-pay` into `content/` without updating this ADR. - `creator-revenue` and `wechat-notify` stay under `payment/`. ## Out of scope PSR-4 class namespaces; class renames.