Context
Submission statuses are the backbone of the reviewer table, kanban board, email templates, analytics, and result previews — but they exist as two out-of-sync JSON lists in forms.config with no UI to manage them. Changing the pipeline currently means raw SQL.
Current behavior
config.application.subfields[status].options drives the table dropdown, status chips w/ counts, board columns, and bulk/assignment flows (12 statuses live on form 19, incl. might_interview, emailed_for_interview, waitlisted).
config.application.status[] (9 statuses on form 19, {id,label,description}) drives the email-template picker and the Settings result previews.
- The two lists drift independently (form 19 is currently out of sync). No editor for either.
- Chip colors are a hardcoded
STATUS_COLORS map in columns.tsx (9 keys); statuses outside it render unstyled. Board fallback pipeline is hardcoded in board/page.tsx.
config.application.status[*].pageId ("offerPage") has no consumer anywhere.
Desired behavior
- Single admin editor (natural home: Settings or Questions tab) to add/remove/reorder/relabel statuses and assign colors, writing a single source of truth.
- One canonical status list; the reviewer pipeline (subfields options), email-template picker, previews, and analytics derive from it (either unify the JSON shape or auto-sync the two keys on save).
- Colors stored per status in config with a fallback for unconfigured statuses.
- Pipeline order (board columns) follows the configured list order.
- Migration/backfill for existing forms (form 19, 10, …) to the canonical shape.
Acceptance criteria
Context
Submission statuses are the backbone of the reviewer table, kanban board, email templates, analytics, and result previews — but they exist as two out-of-sync JSON lists in
forms.configwith no UI to manage them. Changing the pipeline currently means raw SQL.Current behavior
config.application.subfields[status].optionsdrives the table dropdown, status chips w/ counts, board columns, and bulk/assignment flows (12 statuses live on form 19, incl.might_interview,emailed_for_interview,waitlisted).config.application.status[](9 statuses on form 19,{id,label,description}) drives the email-template picker and the Settings result previews.STATUS_COLORSmap incolumns.tsx(9 keys); statuses outside it render unstyled. Board fallback pipeline is hardcoded inboard/page.tsx.config.application.status[*].pageId("offerPage") has no consumer anywhere.Desired behavior
Acceptance criteria