File size: 4,029 Bytes
9646e24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import { test } from "node:test";
import assert from "node:assert";
import { generateFollowUps, classifyRisk, draftEmail, generateActionPlan } from "../followup/executor";
import { InteractionCapture, TerritoryAccount, FollowUpAction } from "@/types";

const account: TerritoryAccount = {
  id: "acc-1", hcpName: "Jane Smith", specialty: "Oncology", territory: "West-1",
  funnelState: "barrier_identified", barrier: "formulary",
  eligiblePatientOpportunity: 0.7, unmetInfoNeed: 0.6, accessProbability: 0.4,
  expectedResponsiveness: 0.5, evidenceConfidence: 0.7, fieldTimeRequired: 1,
  operationalFriction: 0.3, uncertaintyRisk: 0.2, priorityScore: 0.65,
  reasonCodes: [], recommendedAction: { action: "share formulary info", rationale: "r", fieldRole: "rep", permittedChannel: "email", approvedContentId: "APR-001", estimatedTimeMin: 30, expectedOutcome: "info delivered", confidenceLevel: 0.8, evidenceThatWouldDisprove: "x", autonomyClass: 2 },
};

const capture: InteractionCapture = {
  accountId: "acc-1", hcpName: "Jane Smith", rawInput: "met with HCP",
  knowledgeState: "familiar with on-label data", primaryBarrier: "formulary",
  secondaryBarrier: "reimbursement", requestedFollowUp: "please send approved formulary materials",
  nextBestAction: "share approved formulary status", confidence: 0.85,
  evidenceSource: "in-person", humanConfirmationRequired: false, structuredAt: "2025-01-15T10:00:00Z",
};

test("generateFollowUps produces actions with consistent risk/behavior", () => {
  const actions = generateFollowUps(capture, account);
  assert.ok(actions.length > 0, "should produce actions");
  for (const a of actions) {
    const map = { low: "auto_record", moderate: "draft_and_approve", high: "route_to_compliance", prohibited: "block_and_document" } as const;
    assert.equal(a.systemBehavior, map[a.riskLevel], `behavior matches risk for ${a.type}`);
  }
  console.log("types:", actions.map(a => a.type).join(", "));
  console.log("risks:", actions.map(a => a.riskLevel).join(", "));
});

test("draftEmail is fair-balanced and references approved material", () => {
  const email = draftEmail(capture, account);
  assert.match(email, /APR-001/);
  assert.match(email, /fair-balanced/i);
  assert.doesNotMatch(email, /off-label/i);
  assert.doesNotMatch(email, /guarantee/i);
});

test("generateActionPlan includes prioritized steps and compliance reminders", () => {
  const plan = generateActionPlan(capture, account);
  assert.match(plan, /Prioritized Next Steps/);
  assert.match(plan, /Compliance Reminders/);
  assert.match(plan, /formulary/i);
});

test("prohibited content is blocked and documented", () => {
  const bad = { ...capture, requestedFollowUp: "please send off-label use information" };
  const actions = generateFollowUps(bad, account);
  const blocked = actions.find(a => a.systemBehavior === "block_and_document");
  assert.ok(blocked, "should have a blocked action");
  assert.equal(blocked!.riskLevel, "prohibited");
});

test("classifyRisk escalates high-risk content on low-baseline type", () => {
  const action: FollowUpAction = {
    type: "crm_note", description: "note about adverse event report",
    riskLevel: "low", systemBehavior: "auto_record",
  };
  assert.equal(classifyRisk(action), "high");
});

test("action plan with instructional off-label reminders is NOT prohibited", () => {
  const actions = generateFollowUps(capture, account);
  const plan = actions.find(a => a.type === "action_plan");
  assert.ok(plan, "action plan should exist");
  assert.notEqual(plan!.riskLevel, "prohibited", "instructional off-label mention must not be blocked");
  assert.match(plan!.draftContent ?? "", /off-label/i, "plan should contain the compliance reminder");
});

test("explicit intent to send off-label is blocked even in a crm_note", () => {
  const action: FollowUpAction = {
    type: "crm_note", description: "send off-label information to HCP",
    riskLevel: "low", systemBehavior: "auto_record",
  };
  assert.equal(classifyRisk(action), "prohibited");
});