// Phase 23 demo — 4 staffer personas × 3 contract scenarios each. // Same contracts run against different staffers to measure competence // differential. After the batch, findNeighbors should rank top-staffer // playbooks above junior-staffer playbooks for similar scenarios. // // Output: 12 spec files under tests/multi-agent/scenarios/staffer_demo/ import { mkdir, writeFile } from "node:fs/promises"; import { join } from "node:path"; // Per-staffer tool_level mirrors the real-world asymmetry: senior gets // the most powerful stack, trainee gets the least. The architectural // question is whether the playbook inheritance is strong enough to let // the trainee still produce usable outcomes when the big tools are off. const STAFFERS = [ { id: "S-001", name: "Maria Chen", tenure_months: 48, role: "senior" as const, tool_level: "full" as const }, { id: "S-002", name: "James Park", tenure_months: 14, role: "mid" as const, tool_level: "local" as const }, { id: "S-003", name: "Sam Torres", tenure_months: 4, role: "junior" as const, tool_level: "basic" as const }, { id: "S-004", name: "Alex Rivera", tenure_months: 1, role: "trainee" as const, tool_level: "minimal" as const }, ]; // Three contract shapes — one downtown assembly, one warehouse ramp, // one emergency recovery. Different cities to vary the sig_hash. const CONTRACTS = [ { tag: "nashville_downtown", client: "Riverline Logistics — Nashville Downtown Build-Out", city: "Nashville", state: "TN", contract: { deadline: "2026-05-19", budget_total_usd: 180000, budget_per_hour_max: 32, local_bonus_per_hour: 4, local_bonus_radius_mi: 75, fill_requirement: "paramount" as const, }, events: [ { kind: "baseline_fill", at: "07:00", role: "Welder", count: 4 }, { kind: "expansion", at: "08:30", role: "Packaging Operator", count: 6 }, { kind: "baseline_fill", at: "09:00", role: "Shipping Clerk", count: 2 }, { kind: "emergency", at: "13:00", role: "Welder", count: 2, deadline: "15:00" }, { kind: "misplacement", at: "15:30", role: "Packaging Operator", count: 1, replaces_event: "08:30" }, ], }, { tag: "joliet_warehouse", client: "Midway Distribution — Joliet DC Ramp", city: "Joliet", state: "IL", contract: { deadline: "2026-05-12", budget_total_usd: 120000, budget_per_hour_max: 28, local_bonus_per_hour: 3, local_bonus_radius_mi: 50, fill_requirement: "preferred" as const, }, events: [ { kind: "baseline_fill", at: "07:00", role: "Warehouse Associate", count: 5 }, { kind: "recurring", at: "10:00", role: "Forklift Operator", count: 3 }, { kind: "expansion", at: "12:30", role: "Picker", count: 4 }, { kind: "misplacement", at: "15:00", role: "Forklift Operator", count: 1, replaces_event: "10:00" }, ], }, { tag: "indianapolis_assembly", client: "Pioneer Assembly — Indianapolis Plant Expansion", city: "Indianapolis", state: "IN", contract: { deadline: "2026-05-26", budget_total_usd: 220000, budget_per_hour_max: 30, local_bonus_per_hour: 5, local_bonus_radius_mi: 60, fill_requirement: "paramount" as const, }, events: [ { kind: "baseline_fill", at: "07:30", role: "Assembler", count: 6 }, { kind: "recurring", at: "09:30", role: "Quality Tech", count: 2 }, { kind: "expansion", at: "11:00", role: "Machine Operator", count: 5 }, { kind: "emergency", at: "14:00", role: "Machine Operator", count: 3, deadline: "16:00" }, { kind: "misplacement", at: "16:00", role: "Assembler", count: 1, replaces_event: "07:30" }, ], }, ]; async function main() { const outDir = "tests/multi-agent/scenarios/staffer_demo"; await mkdir(outDir, { recursive: true }); const manifest: Array<{ file: string; staffer: string; contract: string; client: string }> = []; let day = 0; for (const staffer of STAFFERS) { for (const ct of CONTRACTS) { day += 1; const date = new Date(Date.now() + day * 86400000).toISOString().split("T")[0]; const spec = { client: ct.client, date, contract: ct.contract, staffer, events: ct.events.map(e => ({ ...e, city: ct.city, state: ct.state, shift_start: `${e.at} ${e.at.startsWith("0") ? "AM" : "PM"}`, scenario_note: `Staffed by ${staffer.name} (${staffer.role}, ${staffer.tenure_months}mo). Contract deadline ${ct.contract.deadline}, fill=${ct.contract.fill_requirement}.`, })), }; const fname = `${staffer.id}_${ct.tag}.json`; await writeFile(join(outDir, fname), JSON.stringify(spec, null, 2)); manifest.push({ file: fname, staffer: staffer.name, contract: ct.tag, client: ct.client }); } } await writeFile( join(outDir, "manifest.json"), JSON.stringify({ count: manifest.length, scenarios: manifest }, null, 2), ); console.log(`✓ ${manifest.length} staffer-demo specs → ${outDir}/`); for (const m of manifest) console.log(` ${m.file} — ${m.staffer} × ${m.contract}`); } main().catch(e => { console.error("gen_staffer_demo failed:", (e as Error).message); process.exit(1); });