feat(mcp): DEPLOY-job — lifecycle, enqueue-hook, claim-scoping, payload, dispatch, prompt (M17) #62
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/M17-deploy-job"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fase 3 van M17 (PBI-124, auto-deploy op scrum4me-server na PR-merge):
applyDeployTerminalUpdate— lock → status-flip → bulk-cancel/lift in één transactie; SSE per gecancelde rij ná commitmaybeEnqueueDeployJobop het geslaagde ENABLE_AUTO_MERGE-effect (lock → config-read → blokkade-check → create; DB-harde dedup via partial index; triggerPush bij enqueue-falen)Tests: 902/902, tsc schoon. Interleaving-suite bewijst de advisory-lock in beide volgordes; 4 falsificatie-mutaties gedocumenteerd in de story-log (ST-1459). Spec rev 5 + plan v3: Scrum4Me-repo
docs/superpowers/specs/2026-07-03-deploy-job-design.md/docs/plans/M17-deploy-job.md.Na merge (fase-4-voorwaarde): op de server
mcp-stablebijwerken (git pull --ff-only && npm ci) en het runner-image rebuilden met MCP_GIT_REF=main.🤖 Generated with Claude Code
buildDeployOrchestrationKey + maybeEnqueueDeployJob (src/lib/dispatch/deploy-job.ts): lock-eerst-dan-lezen transactie (pg_advisory_xact_lock op hashtext('deploy'), hashtext(productId)), product-config-check (auto_deploy + deploy_flow), blokkade bij onopgeloste FAILED, create zonder requested_*-snapshot (fase-5-lijn), dedup via de partial-unique-index-catch (P2002/23505). notifyJobEnqueued ná commit. Wire in update-job-status.ts: de STORY-mode outcomes-loop (enige live ENABLE_AUTO_MERGE-succes-site — createPullRequest's legacy enableAutoMerge=true-pad wordt nergens meer aangeroepen) krijgt een o.ok-tak die de DEPLOY-job enqueuet; falen daarin logt + triggerPush i.p.v. de aanroeper te breken (persistent signaal, codex plan-r1 #8). Nit uit T-1314-review: comment dat checkDeploySkipReason een PREFIX-match is (staarten zoals ':77199baal live' toegestaan).Fake-lock-harnas (__tests__/deploy-state-interleaving.test.ts): mockt prisma.$transaction met een echte deferred-based in-memory mutex per product-key — de mutex geeft pas vrij als de tx-callback resolvet, exact zoals Postgres een xact-lock vasthoudt tot commit. In-memory claude_jobs-array + Product-map bedienen findFirst/findMany/create/ update/updateMany. Bewijst dat de product-lock (hashtext('deploy'), hashtext(productId)) applyDeployTerminalUpdate (failed-branch, T-1314) en maybeEnqueueDeployJob (T-1316) écht serialiseert, in beide volgordes: - volgorde A: failed-branch houdt de lock vast → enqueue die wacht ziet daarna de FAILED (resolved_at=null) ⇒ 'blocked', geen blok-omzeiling. - volgorde B: enqueue houdt de lock vast en maakt de QUEUED-rij → de wachtende failed-branch cancelt die rij zodra hij de lock krijgt, geen wees-job. Codex plan-r1 #6 / acceptatiecriterium spec §8. 5x achter elkaar gedraaid zonder flakiness.Task 3.6: mcp-spiegel van deployNowAction — handmatige DEPLOY-enqueue via dispatch_job. dispatchDeploy (nieuw, src/lib/dispatch/deploy-dispatch.ts) neemt de product-lock vóór de deploy_flow-read en de active-job-guard (zelfde tx als de create), gooit DispatchError i.p.v. outcome-unions (user-facing dispatch-conventie) en slaat MANUAL/'deploy' op zonder requested_*-snapshot of orchestration_key. ACTIVE_JOB_STATUSES geëxporteerd uit idea-jobs.ts (was lokaal) zodat deploy-dispatch.ts hem hergebruikt i.p.v. inline dupliceren. dispatch-job.ts: DEPLOY in KIND_VALUES, REF_MATRIX.DEPLOY = { required: [] } (v1 = "deploy huidige main", geen refs — pr_url e.d. worden geweigerd), switch-case volgens de bestaande auth/return-conventies.