feat(PBI-67): IDEA_REVIEW_PLAN Phases 3-6 — server actions, UI components, prompt & tests
- Phase 3: startReviewPlanJobAction, cancelIdeaJobAction, status transitions (REVIEWING_PLAN / PLAN_REVIEWED / PLAN_REVIEW_FAILED), status colors, job-card/jobs-column filters, idea-list status tabs - Phase 4: review-plan-job.md prompt (multi-model orchestration with codex injection + active plan revision via update_idea_plan_md after each round), runbook, 13 unit tests - Phase 5: ReviewLogViewer component (rounds, convergence, approval, issues), idea-detail integration, proper ReviewLog TypeScript types exported from component - Phase 6.1: wait-for-job discriminator wired (IDEA_REVIEW_PLAN), plan-revision step made mandatory in prompt (was previously optional/missing) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
873b42a87e
commit
dac890b82c
18 changed files with 1952 additions and 13 deletions
|
|
@ -408,6 +408,7 @@ export async function downloadIdeaMdAction(
|
|||
|
||||
const GRILL_TRIGGERABLE_FROM: IdeaStatus[] = ['DRAFT', 'GRILLED', 'GRILL_FAILED', 'PLAN_READY', 'PLANNED']
|
||||
const MAKE_PLAN_TRIGGERABLE_FROM: IdeaStatus[] = ['GRILLED', 'PLAN_FAILED', 'PLAN_READY']
|
||||
const REVIEW_PLAN_TRIGGERABLE_FROM: IdeaStatus[] = ['PLAN_READY', 'PLAN_REVIEWED']
|
||||
|
||||
export async function startGrillJobAction(id: string): Promise<ActionResult<{ job_id: string }>> {
|
||||
return startIdeaJob(id, 'IDEA_GRILL', 'GRILLING', GRILL_TRIGGERABLE_FROM)
|
||||
|
|
@ -417,6 +418,10 @@ export async function startMakePlanJobAction(id: string): Promise<ActionResult<{
|
|||
return startIdeaJob(id, 'IDEA_MAKE_PLAN', 'PLANNING', MAKE_PLAN_TRIGGERABLE_FROM)
|
||||
}
|
||||
|
||||
export async function startReviewPlanJobAction(id: string): Promise<ActionResult<{ job_id: string }>> {
|
||||
return startIdeaJob(id, 'IDEA_REVIEW_PLAN', 'REVIEWING_PLAN', REVIEW_PLAN_TRIGGERABLE_FROM)
|
||||
}
|
||||
|
||||
async function startIdeaJob(
|
||||
id: string,
|
||||
kind: ClaudeJobKind,
|
||||
|
|
@ -547,12 +552,15 @@ export async function cancelIdeaJobAction(id: string): Promise<ActionResult> {
|
|||
|
||||
// Bepaal terugval-status. Bij een lopende grill: terug naar GRILLED als er
|
||||
// al eerder grill_md was, anders DRAFT. Bij plan-job: PLAN_READY als er al
|
||||
// plan_md was (re-plan-cancel), anders GRILLED.
|
||||
// plan_md was (re-plan-cancel), anders GRILLED. Bij review-plan: terug naar
|
||||
// PLAN_READY (review kan altijd opnieuw gestart worden).
|
||||
let revertStatus: IdeaStatus
|
||||
if (job.kind === 'IDEA_GRILL') {
|
||||
revertStatus = idea.grill_md ? 'GRILLED' : 'DRAFT'
|
||||
} else if (job.kind === 'IDEA_MAKE_PLAN') {
|
||||
revertStatus = idea.plan_md ? 'PLAN_READY' : 'GRILLED'
|
||||
} else if (job.kind === 'IDEA_REVIEW_PLAN') {
|
||||
revertStatus = 'PLAN_READY'
|
||||
} else {
|
||||
return { error: `Job kind ${job.kind} hoort niet bij een idee`, code: 422 }
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue