diff --git a/scripts/curator-static-registry.test.ts b/scripts/curator-static-registry.test.ts index 07c5362..0379612 100644 --- a/scripts/curator-static-registry.test.ts +++ b/scripts/curator-static-registry.test.ts @@ -13,10 +13,12 @@ const ICP_IDS: CuratorIcpId[] = [ const LIVE_ROUTE_PREFIX: Record = { "courses-service": "/agents/courses", + "qscore-service": "/agents/qscore", "resume-service": "/agents/resume", "interview-service": "/agents/interview", "roleplay-service": "/agents/roleplay", "matchmaking-service": "/agents/matchmaking", + "social-branding-service": "/agents/social-branding", }; const EXPECTED_FOCUS: Record = { @@ -60,14 +62,12 @@ async function main() { }); try { - assert(preview.version === "icp-v7-static", `${icpId}: expected static plan version`); - assert(preview.idempotency.promptHash === "static-task-registry", `${icpId}: prompt hash should prove static registry mode`); - assert(preview.plan.days.length === 30, `${icpId}: expected 30 generated days`); - assert(preview.plan.calendarWeeks.length === 5, `${icpId}: expected 5 sprint-relative calendar weeks`); + assert(preview.version === "icp-v10-static", `${icpId}: expected static plan version`); + assert(preview.plan.days.length === 7, `${icpId}: expected 7 generated days`); + assert(preview.plan.calendarWeeks.length === 1, `${icpId}: expected one sprint-relative calendar week`); const firstSevenFocus = preview.plan.days.slice(0, 7).map((day) => day.focus); assert(JSON.stringify(firstSevenFocus) === JSON.stringify(EXPECTED_FOCUS[icpId]), `${icpId}: first 7 focus labels must match 7-day sprint doc`); - assert(JSON.stringify(firstSevenFocus) === JSON.stringify(preview.plan.days.slice(7, 14).map((day) => day.focus)), `${icpId}: 7-day sprint should repeat after day 7 for now`); const dayOneTitles = preview.plan.days[0]?.tasks.map((task) => task.title); assert(JSON.stringify(dayOneTitles) === JSON.stringify(EXPECTED_DAY_ONE_TITLES[icpId]), `${icpId}: day 1 task titles must match docs`); @@ -84,7 +84,7 @@ async function main() { for (const task of day.tasks) { assert(task.missionId === "curator-sprint", `${icpId} ${task.id}: missionId mismatch`); - assert(task.missionInstanceId?.startsWith("curator-sprint:icp-v7-static:"), `${icpId} ${task.id}: missionInstanceId should use static version`); + assert(task.missionInstanceId?.startsWith("curator-sprint:icp-v10-static:"), `${icpId} ${task.id}: missionInstanceId should use static version`); assert(task.stageId?.includes(`${task.serviceId?.replace("-service", "")}`), `${icpId} ${task.id}: stageId should include service segment`); assert(task.id.includes(`${task.serviceId?.replace("-service", "")}`), `${icpId} ${task.id}: taskId should include service segment`); assert(task.actorName !== "Vera" && task.actorName !== "Kai" && task.actorName !== "Mira" && task.actorName !== "Lyra", `${icpId} ${task.id}: agent persona leaked into actorName`); @@ -102,8 +102,20 @@ async function main() { assert(url.searchParams.get("missionId") === task.missionId, `${icpId} ${task.id}: route missionId mismatch`); assert(url.searchParams.get("missionInstanceId") === task.missionInstanceId, `${icpId} ${task.id}: route missionInstanceId mismatch`); assert(url.searchParams.get("stageId") === task.stageId, `${icpId} ${task.id}: route stageId mismatch`); + assert(url.searchParams.get("taskTitle") === task.title, `${icpId} ${task.id}: route taskTitle mismatch`); + assert(url.searchParams.get("taskSubtitle") === task.subtitle, `${icpId} ${task.id}: route taskSubtitle mismatch`); + assert(url.searchParams.get("taskType") === task.taskType, `${icpId} ${task.id}: route taskType mismatch`); - if (task.serviceId === "interview-service" || task.serviceId === "roleplay-service") { + if (task.serviceId === "interview-service") { + const taskText = `${task.title} ${task.subtitle}`.toLowerCase(); + const isIntroductionTask = /(?:60|90)[ -]?second|\bintroduction\b|\bpitch\b|\bpresentation\b/.test(taskText); + assert(url.searchParams.get("type") === (isIntroductionTask ? "warm_up" : "behavioral"), `${icpId} ${task.id}: interview type must match task intent`); + assert(url.searchParams.get("role") === (isIntroductionTask ? null : "Product Manager"), `${icpId} ${task.id}: interview role must match task intent`); + assert(url.searchParams.get("difficulty") === (isIntroductionTask ? "easy" : "medium"), `${icpId} ${task.id}: interview difficulty must match task intent`); + assert(url.searchParams.get("duration") === "5", `${icpId} ${task.id}: interview route should carry duration`); + } + + if (task.serviceId === "roleplay-service") { assert(url.searchParams.get("role") === "Product Manager", `${icpId} ${task.id}: practice route should preserve target role`); assert(url.searchParams.get("duration") === "5", `${icpId} ${task.id}: practice route should carry duration`); } @@ -119,7 +131,7 @@ async function main() { process.exit(1); } - console.log(`curator-static-registry tests passed for ${ICP_IDS.length} ICPs, 30 days each, 4 doc-backed tasks per day`); + console.log(`curator-static-registry tests passed for ${ICP_IDS.length} ICPs, 7 days each, 4 doc-backed tasks per day`); } main().catch((err) => {