Loading issues
The product's #1 differentiator: deep configurability at workspace and per-user level. Today there is no settings infrastructure beyond a browser cookie for status-group order (tesks-ui/lib/prefs.ts).
settings blob per workspace and a JSONB prefs blob per user-per-workspace — no migration per new toggle; validated/typed in app code.settings.manage; user prefs editable by any signed-in member for themselves.workspace_settings + user_pref tables; backend WorkspaceSettingsService + REST endpoints; UI DAL + actions + a Features section in settings. Proof-of-pattern toggles: voting on/off (workspace-level, enforced in VoteService) and status-group order migrated from cookie → DB (per-user).prefs.hiddenFeatures) — mechanism shipped with the substrate; concrete opt-outs wired as optional features land (due dates/sprints from PAR-190).Feature toggles for not-yet-built features (due dates, sprints) register as those features land (PAR-190); the substrate makes them gateable. Depends on RBAC (PAR-182) for who edits settings.
Substrate first vertical verified fully delivered — closing.
workspace_settings + user_pref JSONB tables (V20).WorkspaceSettingsService (settings write gated on settings.manage; user prefs by the acting member) + PUT /settings and /prefs endpoints.VoteService.cast refuses when off) and sprints (WorkspaceAdminService.createSprint). Subtasks/due-dates enforcement landed alongside PAR-190.lib/sql/settings.ts DAL + lib/actions/settings.ts + a Features section in settings (settings.manage-gated); vote UI gated on settings.voting; status-group order migrated from cookie → per-user DB prefs (prefs.server.ts).prefs.hiddenFeatures) exists.Explicitly out of scope here (their own items): custom fields → PAR-196, team join policy → PAR-197.
Substrate shipped to develop — the core of this epic is done and verified:
e4b6f98): migration V20 adds JSONBworkspace_settings+user_pref;WorkspaceSettingsServicewrites both (settings gated onsettings.manage; prefs per-user) and exposesvotingEnabled(), enforced inVoteService; RESTPUT /api/w/{slug}/settings+/prefs. 3 tests; backend suite 115 green.7833aba):lib/sql/settingsreads from the mirror; a Features section in settings toggles voting; the issue detail hides the VoteControl when voting is off. Status-group order migrated from cookie → DB (per-user-per-workspace), with cookie/default fallback. typecheck + vitest + next build green.The JSONB substrate + per-user prefs + first real toggle establish the pattern that planning/search features (and the per-user
hiddenFeaturesopt-out) plug into.Remaining scope split out: PAR-196 (custom fields) and PAR-197 (team join policy). Configurable status categories is a possible later add. Marking this epic's substrate Pending Release.