Repository navigation
GUI CRUD incomplete: Delete missing for portfolios/programs/work-items/goals/sprints/kanban despite backend DELETE endpoints; boards lack backend Update/Delete entirely #12695
Description
Summary
The company-OS (LLC) GUI is not CRUD-complete: users can Create and Edit every entity, but cannot Delete most of them from the UI — even though the backend exposes a DELETE endpoint for each. Entities therefore accumulate with no removal path (the same class as #12212 for companies). One entity (boards/kanban) also lacks Update/Delete on the backend.
The CRUD matrix (verified live + in source)
| entity | backend | GUI-Create | GUI-Edit | GUI-Delete |
|---|---|---|---|---|
| companies | CRUD | ✅ | ✅ | ❌ (archive only, no delete — #12212) |
| portfolios | CRUD | ✅ | ✅ | ❌ |
| programs | CRUD | ✅ | ✅ | ❌ |
| projects | CRUD | ✅ | ✅ | ✅ |
| work-items | CRUD | ✅ | ✅ | ❌ |
| goals | CRUD | ✅ | ✅ | ❌ |
| sprints | CRUD | ✅ | ✅ | ❌ |
| kanban/boards | CR-- | ✅ | ❌ | ❌ (backend has no PUT/DELETE either) |
| routines | CRUD | ✅ | ✅ | ✅ |
| backlog | (work-items) | ✅ | ✅ | ✅ |
Delete is missing from the GUI for portfolios, programs, work-items, goals, sprints, and kanban. Create and Edit are present everywhere.
Evidence
Backend DELETE endpoints exist for every gap entity:
DELETE /api/llc/portfolios/{portfolio_id}
DELETE /api/llc/programs/{program_id}
DELETE /api/llc/work-items/{work_item_id}
DELETE /api/llc/goals/{goal_id}
DELETE /api/llc/sprints/{sprint_id}
But the frontend makes no delete call to any of them — checked across all of autobot-frontend/src (.delete( to these endpoints): none for portfolio, program, work-item, goal, sprint, or kanban. The incidental "delete" string matches in the views are unrelated (no wired action). Views exist for every entity (PortfolioBrowserView, ProgramBrowserView, WorkItemDetail, GoalTree, SprintBoardView, KanbanBoardView, …) and each has Create + Edit affordances — Delete is the consistent omission.
boards/kanban is worse: the backend board API is CR-- (list + create only — no PUT/DELETE), so the kanban board itself can't be renamed or removed even via API.
Impact
Medium-high for a management product. The whole point of a portfolio/program/project/sprint/backlog hierarchy is lifecycle management, and half of it (removal) is unreachable from the UI:
- Mistaken or test entities (like the ones created while exercising this API) are permanent from the user's perspective — they can only be created and edited, never cleaned up.
- Combined with LLC: no way to archive/delete companies (only projects have /archive); stale companies accumulate #12212 (companies) and the archived-company dead-end (LLC company transitions 500 but commit anyway — MissingGreenlet on commit()→serialize (#12209 pattern, 5 sites in companies.py + sprints.py); archived is unrecoverable #12309 secondary finding), the platform has a systemic "you can make it but you can't unmake it" gap.
- Reviewers/operators lose trust in a board that fills with un-removable items.
Recommendation
- Add Delete (with confirm) to every entity view whose backend supports it: portfolios, programs, work-items, goals, sprints. The endpoints already exist — this is pure frontend wiring.
- Boards need backend Update+Delete first (
PUT/DELETE /api/llc/boards/{id}), then a UI affordance — this is a backend gap, not just frontend. - Prefer soft-delete/archive where audit history matters (goals, work-items with history), hard-delete where not — but expose some removal path in every case.
- Add a GUI-CRUD-completeness check to the api-wiring discipline: for every entity with a backend DELETE, assert the frontend has a corresponding wired action — this class of gap is mechanically detectable.
Environment
install.sh deploy at /opt/autobot. Backend CRUD from live openapi.json; GUI coverage from autobot-frontend/src LLC views. Related: #12212 (company delete), #12213 (kanban UI), #12309 (archived dead-end).
Activity
feat(llc): board Update and Delete — boards had neither at the backend (