From f81d9929161ad2d8f14f472056711a30b3d20d9d Mon Sep 17 00:00:00 2001 From: janpeter visser Date: Fri, 1 May 2026 11:59:34 +0200 Subject: [PATCH] fix(db): promote task naar IN_PROGRESS bij ClaudeJob CLAIMED/RUNNING MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Solo-kaart bleef in 'Te doen'-kolom staan terwijl de agent al bezig was — alleen DONE was via een trigger gekoppeld (vorige migration). Nieuwe Postgres-trigger claude_job_claim_to_task: bij INSERT of UPDATE OF status naar CLAIMED|RUNNING promoot de bijbehorende task van TO_DO naar IN_PROGRESS. Forceert niet vanuit andere status — handmatige overrides (REVIEW, DONE) blijven staan. De bestaande notify_task_change-trigger op tasks zorgt automatisch voor de pg_notify zodat de Solo-paneel-UI direct synct. - migration: 20260501130000_promote_task_to_in_progress_on_claim - doc: architecture.md sectie 'Auto-promote task-status op job-overgangen' uitgebreid Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/scrum4me-architecture.md | 9 +++-- .../migration.sql | 35 +++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 prisma/migrations/20260501130000_promote_task_to_in_progress_on_claim/migration.sql diff --git a/docs/scrum4me-architecture.md b/docs/scrum4me-architecture.md index 5d3c373..c7ecd7d 100644 --- a/docs/scrum4me-architecture.md +++ b/docs/scrum4me-architecture.md @@ -1161,9 +1161,14 @@ UI klikt 'Voer uit' `enqueueClaudeJobAction` weigert een tweede enqueue als er al een job bestaat met `status IN (QUEUED, CLAIMED, RUNNING)`. Teruggestuurde fout bevat het bestaande `jobId` zodat de UI ernaar kan linken. -### Auto-promote task naar DONE +### Auto-promote task-status op job-overgangen -Wanneer een `claude_job` op `DONE` komt, vuurt de Postgres-trigger `claude_job_status_to_task` (zie `prisma/migrations/20260501110000_sync_task_status_from_claude_job`) en zet de bijbehorende task ook op `DONE`. Werkt voor INSERT (direct als DONE aangemaakt) en UPDATE (transitie naar DONE). Idempotent: skip wanneer de task al DONE is. De bestaande `notify_task_change`-trigger op `tasks` vuurt dan automatisch de pg_notify zodat de Solo-paneel-UI synct — geen extra plumbing in de SSE-handler nodig. +Twee Postgres-triggers houden `task.status` in sync met `claude_job.status` zodat de Solo-kaart altijd in de juiste kolom staat: + +- **`claude_job_claim_to_task`** (`prisma/migrations/20260501130000_promote_task_to_in_progress_on_claim`): bij INSERT met status `CLAIMED|RUNNING` of UPDATE OF status naar `CLAIMED|RUNNING`, promoot de bijbehorende task van `TO_DO` naar `IN_PROGRESS`. Forceert niet vanuit andere status — handmatige overrides (REVIEW, DONE) blijven staan. +- **`claude_job_status_to_task`** (`prisma/migrations/20260501110000_sync_task_status_from_claude_job`): bij DONE zet de task ook op `DONE`. Idempotent: skip wanneer task al DONE is. + +De bestaande `notify_task_change`-trigger op `tasks` vuurt automatisch de pg_notify naar `/api/realtime/solo` zodat de UI direct synct — geen extra plumbing in de SSE-handler nodig. ### Hybride-ready diff --git a/prisma/migrations/20260501130000_promote_task_to_in_progress_on_claim/migration.sql b/prisma/migrations/20260501130000_promote_task_to_in_progress_on_claim/migration.sql new file mode 100644 index 0000000..711ff39 --- /dev/null +++ b/prisma/migrations/20260501130000_promote_task_to_in_progress_on_claim/migration.sql @@ -0,0 +1,35 @@ +-- Promoot task naar IN_PROGRESS zodra een ClaudeJob CLAIMED of RUNNING wordt. +-- +-- Aanvulling op de DONE-trigger uit +-- 20260501110000_sync_task_status_from_claude_job. Daar handelen we de +-- afronding af; hier handelen we de aanvang. Zonder deze trigger blijft +-- een task in de "Te doen"-kolom staan terwijl de agent er al mee bezig +-- is — verwarrend voor de gebruiker. +-- +-- Voorwaarde: task moet nog op TO_DO staan. We forceren niet vanuit +-- IN_PROGRESS/REVIEW/DONE terug — die zijn handmatig gezet door de +-- gebruiker en hebben prioriteit. +-- +-- De bestaande notify_task_change-trigger op tasks vuurt automatisch de +-- pg_notify naar /api/realtime/solo zodat de UI synct. + +CREATE OR REPLACE FUNCTION promote_task_on_claude_job_claim() RETURNS trigger AS $$ +BEGIN + IF NEW.status IN ('CLAIMED', 'RUNNING') THEN + IF (TG_OP = 'INSERT') + OR (TG_OP = 'UPDATE' AND OLD.status IS DISTINCT FROM NEW.status) + THEN + UPDATE tasks + SET status = 'IN_PROGRESS', updated_at = now() + WHERE id = NEW.task_id AND status = 'TO_DO'; + END IF; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS claude_job_claim_to_task ON claude_jobs; +CREATE TRIGGER claude_job_claim_to_task +AFTER INSERT OR UPDATE OF status ON claude_jobs +FOR EACH ROW +EXECUTE FUNCTION promote_task_on_claude_job_claim();