feat(FN-5196): return 410 Gone for hard-archived task deletions
Implement the hard-archived delete contract: add a typed `ArchivedTaskDeleteError`, map hard-archived task deletes to HTTP 410 Gone at both the store and routes layers, and document the invariant in the soft-delete verification matrix. Fusion-Task-Id: FN-5196
This commit is contained in:
committed by
gsxdsm
parent
6289d4a60b
commit
9a09498397
@@ -18,7 +18,7 @@
|
||||
| 6. Soft-delete an `in-review` task that is currently being merged | Live `in-review`; active merge session in flight | Delete succeeds; live readers omit afterward | Scheduler must not requeue it | Active merge abort, queue removal, and controller cleanup are **pending FN-5142** | N/A | SSE removes card; reload keeps it absent | Preserved until FN-5143 | Hidden from live readers once FN-5140 lands | FN-5142 |
|
||||
| 7. Soft-delete an `in-review` task queued for merge but not yet active | Live `in-review`; merge queued only | Delete succeeds; row stays for forensics only | Scheduler/executor must not pick it up again | Merge queue must filter it out; pending FN-5142 covers deterministic abort/filter assertions | N/A | SSE removes card; reload keeps it absent | Preserved until FN-5143 | Hidden from live readers once FN-5140 lands | FN-5137 / FN-5142 |
|
||||
| 8. Soft-delete a `done` task with archived/visible agent logs and saved task documents | Live `done`; has task docs + agent logs | Delete succeeds; live task readers omit afterward; forensic reads still allowed internally | Not runnable after any engine tick or restart | N/A | N/A | SSE removes card; refresh does not show it in board/ListView/TodoView | `agentLogEntries` must clear atomically; **pending FN-5143** | `/api/documents` and per-task docs must disappear while DB rows remain; **pending FN-5140** | FN-5140 / FN-5143 |
|
||||
| 9. Soft-delete an archived task | Task already archived / moved out of live `tasks` table | Current contract is not pinned; matrix gate requires deterministic error-or-no-op behavior. Follow-up filed as **FN-5196**. | Must never affect active queues either way | N/A | N/A | No dashboard resurrection; exact UX blocked by FN-5196 | N/A | N/A | FN-5196 |
|
||||
| 9. Soft-delete an archived task | Task already archived / moved out of live `tasks` table | `DELETE /api/tasks/:id` returns **410 Gone** with `{ code: "TASK_ALREADY_HARD_ARCHIVED", taskId, archivedAt, message }`. Caller must `POST /api/tasks/:id/unarchive` first, then re-delete; archive-cleanup APIs remain the forensic-removal path. | Never affected; archived rows are absent from live scheduler/executor readers | N/A | N/A | No `task:deleted` SSE re-emit for this failure path; dashboard surfaces the 410 and points to unarchive | N/A | N/A | FN-5196 ✅ |
|
||||
| 10. Soft-delete a task that is checked out by an agent (`checkedOutBy` set) | Live task with lease / checkout metadata | Delete succeeds; linked agent task references clear with delete | Soft-deleted checked-out task must not be auto-claimed or executed after refresh/tick; extra deterministic coverage filed as **FN-5195** | If merge-owned, FN-5142 owns active merge abort details | If triage-owned, FN-5142 owns active triage abort details | SSE removes card; refresh must not show stale checked-out task | Preserved until FN-5143 | Hidden from live readers once FN-5140 lands | FN-5137 / FN-5195 |
|
||||
|
||||
## ID reservation invariant
|
||||
@@ -43,7 +43,7 @@
|
||||
| Stream-wide | `fn_task_delete` tool / skill terminology | No regression asserting soft-delete wording | Missing user-facing copy coverage | `packages/cli/src/__tests__/extension.test.ts` | FN-5141 |
|
||||
| 1,4,6,7,8 | Dashboard SSE + reload deleted-task filtering | `packages/dashboard/src/__tests__/sse-task-deleted-payload.test.ts:5`; `packages/dashboard/app/hooks/__tests__/useTasks.test.ts:1124`; `packages/dashboard/app/hooks/__tests__/useTasks.test.ts:1147`; `packages/dashboard/app/hooks/__tests__/useTasks.test.ts:1255` | GREEN | — | FN-5135 |
|
||||
| 4,10 | Cross-layer delete-during-execution / refresh convergence | No single composition backstop before this task | Added in this task | `packages/engine/src/__tests__/reliability-interactions/soft-delete-end-to-end.test.ts` | FN-5153 |
|
||||
| 9 | Archived-task delete contract | No deterministic store/route assertion; behavior not pinned | New follow-up filed | `packages/core/src/__tests__/soft-delete-tasks.test.ts` and `packages/dashboard/src/__tests__/routes-tasks.test.ts` | FN-5196 |
|
||||
| 9 | Archived-task delete contract | `packages/core/src/__tests__/soft-delete-tasks.test.ts` (`throws TaskAlreadyHardArchivedError when deleting a hard-archived task`, `throws TaskAlreadyHardArchivedError for a legacy in-db archivedTasks row`) and `packages/dashboard/src/__tests__/routes-tasks-ops.test.ts` (`returns 410 TASK_ALREADY_HARD_ARCHIVED when deleteTask throws TaskAlreadyHardArchivedError`) | GREEN — pinned to typed `TaskAlreadyHardArchivedError` + HTTP 410 | — | FN-5196 |
|
||||
| 10 | Checked-out-task soft-delete composition | Entry guards exist, but no coverage focused on checked-out deleted tasks | New follow-up filed | `packages/core/src/__tests__/soft-delete-tasks.test.ts` and `packages/engine/src/__tests__/auto-claim-snapshot-soft-delete.test.ts` | FN-5195 |
|
||||
|
||||
## Release-blocking checks
|
||||
@@ -53,6 +53,7 @@
|
||||
- `pnpm build`
|
||||
- `pnpm --filter @fusion/dashboard test:browser-smoke`
|
||||
- Every scenario-matrix row is GREEN or has a linked follow-up FN task before the FN closing that row merges
|
||||
- Soft-delete against a hard-archived task returns HTTP 410 with `code: TASK_ALREADY_HARD_ARCHIVED` and never silently succeeds (FN-5196)
|
||||
- `packages/engine/src/__tests__/reliability-interactions/soft-delete-end-to-end.test.ts` is fully un-skipped before the stream is declared closed
|
||||
- Manual smoke once on the live dashboard at port 4040: delete one `todo`, one `in-progress`, and one `in-review` task; refresh; confirm none reappear in any board column, ListView, or TodoView; confirm no SSE flicker re-adds the card
|
||||
- `node scripts/audit-squash-merge.mjs <sha>` remains unaffected by any task in this stream
|
||||
|
||||
Reference in New Issue
Block a user