"""Generate Torts analysis PDF for Intesar S. (May 28, 2026)."""

from reportlab.lib.pagesizes import letter
from reportlab.lib.units import inch
from reportlab.lib.colors import HexColor
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_LEFT, TA_JUSTIFY
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable
)
import os

NAVY       = "#1a2744"
GOLD       = "#c9a227"
MED_TEXT   = "#2d3748"
LIGHT_TEXT = "#4a5568"
BORDER     = "#d4cfc5"
WARM_BG    = "#fdf6ee"
COOL_BG    = "#eef5ee"
ACTION_BG  = "#f0f4ff"
REWRITE_BEFORE = "#fce8e8"
REWRITE_AFTER  = "#e2f0e2"

OUTPUT_DIR = os.path.dirname(os.path.abspath(__file__))
OUTPUT_FILE = os.path.join(OUTPUT_DIR, "Intesar_Torts_Analysis.pdf")

sTitle = ParagraphStyle("Title", fontName="Helvetica-Bold", fontSize=20,
                        leading=26, textColor=HexColor(NAVY), alignment=TA_LEFT)
sSubtitle = ParagraphStyle("Subtitle", fontName="Helvetica", fontSize=10,
                           leading=14, textColor=HexColor(LIGHT_TEXT),
                           spaceAfter=6)
sH1 = ParagraphStyle("H1", fontName="Helvetica-Bold", fontSize=13,
                      leading=18, textColor=HexColor(NAVY), spaceBefore=10,
                      spaceAfter=4)
sH2 = ParagraphStyle("H2", fontName="Helvetica-Bold", fontSize=11,
                      leading=15, textColor=HexColor(MED_TEXT), spaceBefore=6,
                      spaceAfter=3)
sBody = ParagraphStyle("Body", fontName="Helvetica", fontSize=9.5,
                        leading=14, textColor=HexColor(MED_TEXT),
                        alignment=TA_JUSTIFY, spaceAfter=4)
sBlock = ParagraphStyle("Block", fontName="Helvetica", fontSize=9,
                         leading=13.5, textColor=HexColor(MED_TEXT),
                         alignment=TA_JUSTIFY)
sAction = ParagraphStyle("Action", fontName="Helvetica", fontSize=9,
                          leading=13.5, textColor=HexColor(MED_TEXT),
                          alignment=TA_LEFT)
sLabel = ParagraphStyle("Label", fontName="Helvetica-Bold", fontSize=8.5,
                         leading=12, textColor=HexColor(LIGHT_TEXT),
                         spaceAfter=2)
sRewriteLabel = ParagraphStyle("RewriteLabel", fontName="Helvetica-Bold",
                                fontSize=8, leading=11,
                                textColor=HexColor(LIGHT_TEXT))
sRewriteText = ParagraphStyle("RewriteText", fontName="Helvetica",
                               fontSize=9.5, leading=14,
                               textColor=HexColor(MED_TEXT),
                               alignment=TA_JUSTIFY)
sFooter = ParagraphStyle("Footer", fontName="Helvetica", fontSize=8,
                          leading=10, textColor=HexColor(LIGHT_TEXT),
                          alignment=TA_LEFT)

def gold_hr(width="25%"):
    return HRFlowable(width=width, thickness=1.5, color=HexColor(GOLD),
                      spaceAfter=8, spaceBefore=4)

def thin_hr():
    return HRFlowable(width="100%", thickness=0.5, color=HexColor(BORDER),
                      spaceAfter=6, spaceBefore=8)

def shaded_block(label_text, body_text, bg_color):
    label = Paragraph(label_text, sLabel)
    body  = Paragraph(body_text, sBlock)
    inner = Table([[label], [body]], colWidths=["100%"])
    inner.setStyle(TableStyle([
        ("BACKGROUND", (0, 0), (-1, -1), HexColor(bg_color)),
        ("TOPPADDING",    (0, 0), (-1, 0), 6),
        ("BOTTOMPADDING", (0, -1), (-1, -1), 8),
        ("LEFTPADDING",   (0, 0), (-1, -1), 10),
        ("RIGHTPADDING",  (0, 0), (-1, -1), 10),
        ("BOX", (0, 0), (-1, -1), 0.5, HexColor(BORDER)),
    ]))
    return inner

def action_box(text):
    body = Paragraph(text, sAction)
    t = Table([[body]], colWidths=["100%"])
    t.setStyle(TableStyle([
        ("BACKGROUND", (0, 0), (-1, -1), HexColor(ACTION_BG)),
        ("TOPPADDING",    (0, 0), (-1, -1), 8),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 8),
        ("LEFTPADDING",   (0, 0), (-1, -1), 10),
        ("RIGHTPADDING",  (0, 0), (-1, -1), 10),
        ("BOX", (0, 0), (-1, -1), 0.5, HexColor(BORDER)),
    ]))
    return t

def rewrite_pair(before_text, after_text):
    bLabel = Paragraph("CONCLUSORY", sRewriteLabel)
    bText  = Paragraph(before_text, sRewriteText)
    before_block = Table([[bLabel], [bText]], colWidths=["100%"])
    before_block.setStyle(TableStyle([
        ("BACKGROUND", (0, 0), (-1, -1), HexColor(REWRITE_BEFORE)),
        ("TOPPADDING",    (0, 0), (-1, 0), 5),
        ("BOTTOMPADDING", (0, -1), (-1, -1), 7),
        ("LEFTPADDING",   (0, 0), (-1, -1), 10),
        ("RIGHTPADDING",  (0, 0), (-1, -1), 10),
        ("BOX", (0, 0), (-1, -1), 0.5, HexColor(BORDER)),
    ]))
    aLabel = Paragraph("REWRITTEN", sRewriteLabel)
    aText  = Paragraph(after_text, sRewriteText)
    after_block = Table([[aLabel], [aText]], colWidths=["100%"])
    after_block.setStyle(TableStyle([
        ("BACKGROUND", (0, 0), (-1, -1), HexColor(REWRITE_AFTER)),
        ("TOPPADDING",    (0, 0), (-1, 0), 5),
        ("BOTTOMPADDING", (0, -1), (-1, -1), 7),
        ("LEFTPADDING",   (0, 0), (-1, -1), 10),
        ("RIGHTPADDING",  (0, 0), (-1, -1), 10),
        ("BOX", (0, 0), (-1, -1), 0.5, HexColor(BORDER)),
    ]))
    return [before_block, Spacer(1, 4), after_block]


doc = SimpleDocTemplate(
    OUTPUT_FILE, pagesize=letter,
    leftMargin=0.65*inch, rightMargin=0.65*inch,
    topMargin=0.55*inch, bottomMargin=0.5*inch,
)

story = []

story.append(Paragraph("Deepening Your Analysis: Torts", sTitle))
story.append(gold_hr("25%"))
story.append(Paragraph("Intesar S.&nbsp;&nbsp;|&nbsp;&nbsp;Band 2/6&nbsp;&nbsp;|&nbsp;&nbsp;May 28, 2026", sSubtitle))
story.append(Spacer(1, 6))

story.append(Paragraph(
    "This report walks through your Torts essay side by side with a model "
    "Band 6 analysis. For each issue, you will see your analysis, the model "
    "analysis, and targeted commentary on what to sharpen. The goal is not to "
    "rewrite your essay -- it is to show you the specific analytical moves that "
    "separate your current approach from a passing answer. At the end, you will find "
    "concrete rewrite examples that turn conclusory sentences into the kind of "
    "element-by-element reasoning graders reward.",
    sBody
))
story.append(Spacer(1, 4))


# ═══════════════════════════════════════════════════════════════════════
# ISSUE 1: Duty to Act / Special Relationship
# ═══════════════════════════════════════════════════════════════════════
story.append(thin_hr())
story.append(Paragraph("Issue 1: Duty to Act -- Special Relationship (MISSED)", sH1))

story.append(Spacer(1, 4))
story.append(shaded_block("YOUR ANALYSIS",
    "<i>This issue was not addressed in your essay. You discussed vicarious liability and "
    "attractive nuisance but never identified the core question the prompt was testing: "
    "whether Mr. Gopher had an affirmative <b>duty to act</b> based on his status as an "
    "on-duty lifeguard.</i>",
    WARM_BG
))
story.append(Spacer(1, 6))

story.append(shaded_block("MODEL ANALYSIS",
    "To establish a prima facie case for negligence, a plaintiff must prove duty, breach, "
    "causation, and damages. <b>Generally, there is no affirmative duty to rescue a person "
    "in peril.</b> However, exceptions exist where one has a <b>special relationship</b> "
    "with the person in peril or has <b>undertaken a duty to act</b>. An employer/employee "
    "relationship where the employee's duties include safety -- like a lifeguard -- creates "
    "such a duty to those within the zone of risk.<br/><br/>"
    "Here, Mr. Gopher was an on-duty, certified lifeguard. By accepting this position, he "
    "<b>undertook a duty</b> to monitor the pool and rescue anyone in distress. This duty "
    "extends to all persons in the pool area, <b>regardless of their status as a member or "
    "trespasser</b>. His belief that he had no duty to a trespasser is an incorrect "
    "understanding of the law; his role as a lifeguard imposes an affirmative duty to act. "
    "He breached this duty when he saw Leo fall in, watched him struggle, and did not "
    "intervene. This breach was the actual and proximate cause of Leo's serious and permanent "
    "lung damage. All elements of negligence are met.<br/><br/>"
    "Therefore, Mr. Gopher is liable to Leo for negligence.",
    COOL_BG
))
story.append(Spacer(1, 6))

story.append(Paragraph("COMMENTARY", sLabel))
story.append(Paragraph(
    "This was the central issue the prompt was testing, and missing it entirely is the "
    "single biggest factor in the Band 2 score. The call asked whether Mr. Gopher is liable "
    "to Leo <i>for negligence</i> -- which requires analyzing the four elements: duty, "
    "breach, causation, and damages.<br/><br/>"
    "<b>The critical gap is the duty analysis.</b> You discussed vicarious liability and "
    "attractive nuisance, but the prompt was not asking about the Club's liability here -- "
    "it was asking about <i>Mr. Gopher's personal liability</i>. The key legal question is "
    "whether a lifeguard has a duty to rescue <i>anyone</i> in the pool, including a "
    "trespasser. The answer is yes: a lifeguard's role creates a special relationship or "
    "undertaking that imposes an affirmative duty to act.<br/><br/>"
    "<b>Why this matters on the bar exam:</b> When a fact pattern involves someone failing "
    "to act (rather than acting negligently), the grader is looking for you to address the "
    "\"no duty to rescue\" general rule and then identify the exception. This is one of the "
    "most heavily tested torts patterns. You must train yourself to recognize it: <i>whenever "
    "the facts show someone watching harm happen and doing nothing, the prompt is testing "
    "duty to act.</i>",
    sBody
))
story.append(Spacer(1, 4))

story.append(action_box(
    "<b>Build this habit:</b> When you see a fact pattern where someone <i>fails to act</i>, "
    "always write this framework: <i>\"Generally, there is no affirmative duty to rescue. "
    "However, a duty arises when [special relationship / undertaking / creation of peril]. "
    "Here, [defendant] had a [type of relationship] with [plaintiff] because [specific facts], "
    "which created a duty to [act]. By failing to [act], [defendant] breached this duty.\"</i>"
))
story.append(Spacer(1, 6))


# ═══════════════════════════════════════════════════════════════════════
# ISSUE 2: Negligent Entrustment and Negligent Hiring
# ═══════════════════════════════════════════════════════════════════════
story.append(thin_hr())
story.append(Paragraph("Issue 2: Negligent Entrustment (Ms. Fox) and Negligent Hiring (Club)", sH1))

story.append(Spacer(1, 4))
story.append(shaded_block("YOUR ANALYSIS",
    "<b>Ms. Fox:</b> A parent is not held liable for the torts of their child. However, "
    "a parent can be held for the torts of their underage child if the parent has reason to "
    "know of the child's misconduct and allowed the conduct knowing damage is very likely to "
    "occur. Ms. Fox knew her son had a speeding ticket and two at-fault accidents. She "
    "allowed him to drive without supervision, putting her at fault.<br/><br/>"
    "<b>Club:</b> Vicariously liable rule above. The Country Club will likely be found liable "
    "for Mr. Gopher's inaction, for Mr. Gopher was under the scope of employment.",
    WARM_BG
))
story.append(Spacer(1, 6))

story.append(shaded_block("MODEL ANALYSIS",
    "<b>(a) Claim against Ms. Fox -- Negligent Entrustment:</b> Ms. Fox can be held liable "
    "under a theory of <b>negligent entrustment</b>. The Restatement (Second) of Torts "
    "provides that one who supplies a chattel for the use of another whom the supplier "
    "<b>knows or should know is likely to use it in a manner involving unreasonable risk "
    "of physical harm</b> is liable for the resulting harm. Ms. Fox knew that Ferret had "
    "a recent history of a speeding ticket and two at-fault accidents. This knowledge gave "
    "her reason to know he was a risky driver. By entrusting her car to him despite this "
    "knowledge, she acted negligently. Ferret's subsequent negligence in texting while "
    "driving was the type of harm that made the entrustment negligent. Therefore, Ms. Fox "
    "is liable for negligent entrustment.<br/><br/>"
    "<b>(b) Claim against Club -- Negligent Hiring:</b> The Club is liable for "
    "<b>negligent hiring</b>. This is a form of <b>direct, not vicarious, liability</b>. "
    "An employer has a duty to exercise reasonable care in hiring employees to ensure they "
    "are fit for the position. The Club breached this duty by failing to perform a simple "
    "background check on Mr. Gopher. Such a check would have revealed he was fired from "
    "his previous lifeguarding job for the very same failure to act in an emergency. "
    "Hiring him without this check was negligent, and this negligence was a cause of "
    "Leo's injuries. Therefore, the Club is liable for negligent hiring.",
    COOL_BG
))
story.append(Spacer(1, 6))

story.append(Paragraph("COMMENTARY", sLabel))
story.append(Paragraph(
    "Two critical problems here:<br/><br/>"
    "<b>First, you used the wrong legal theory for Ms. Fox.</b> You framed her liability as "
    "\"parental liability for a child's torts,\" which is a narrow doctrine. The correct "
    "theory is <b>negligent entrustment</b> -- liability for supplying a dangerous "
    "instrumentality (a car) to someone you know is likely to use it dangerously. This is "
    "not about being a parent; it is about being the person who handed the keys to a known "
    "risky driver. The distinction matters because negligent entrustment has specific elements "
    "(supplier + chattel + knowledge of risk + resulting harm) that you need to state and "
    "apply.<br/><br/>"
    "<b>Second, you used vicarious liability for the Club instead of negligent hiring.</b> "
    "The prompt asked about the Club's liability for Mr. Gopher's <i>inaction</i>. Vicarious "
    "liability (respondeat superior) might apply, but the stronger and more precise theory "
    "is <b>negligent hiring</b> -- the Club's <i>own</i> negligence in hiring an unfit "
    "employee. This is <i>direct</i> liability, not vicarious. The distinction is legally "
    "significant: negligent hiring holds the employer liable for its own failure to screen, "
    "not for the employee's tort. The facts scream this theory -- the Club skipped a "
    "background check that would have revealed Gopher was fired for the exact same failure.",
    sBody
))
story.append(Spacer(1, 4))

story.append(action_box(
    "<b>Build this habit:</b> When the prompt gives you facts about someone's <i>knowledge "
    "of another person's dangerous tendencies</i> plus <i>providing them with something "
    "dangerous</i>, the theory is negligent entrustment: <i>\"One who supplies a [chattel] "
    "to another whom the supplier knows or should know is likely to use it in a manner "
    "involving unreasonable risk of harm is liable. Here, [supplier] knew [facts about "
    "risk] and supplied [chattel], making [supplier] liable for the resulting harm.\"</i>"
))
story.append(Spacer(1, 6))


# ═══════════════════════════════════════════════════════════════════════
# ISSUE 3: Wrongful Death and Survival Actions
# ═══════════════════════════════════════════════════════════════════════
story.append(thin_hr())
story.append(Paragraph("Issue 3: Wrongful Death and Survival Actions", sH1))

story.append(Spacer(1, 4))
story.append(shaded_block("YOUR ANALYSIS",
    "Wrongful death suit entails 1) a wrongful death of a family member and 2) a defendant "
    "who negligently caused the death or had reason or control of someone who caused the death. "
    "Mrs. Crow would likely be able to present a wrongful death suit on behalf of herself and "
    "on behalf of Mr. Crow's estate. Mrs. Crow had suffered through the death of her husband, "
    "who succumbed to his injuries after being struck by a car due to the negligence of Ms. Fox "
    "and her son Ferret.",
    WARM_BG
))
story.append(Spacer(1, 6))

story.append(shaded_block("MODEL ANALYSIS",
    "At common law, a tort action abated at the victim's death. Modernly, statutes create "
    "<b>two distinct causes of action</b>:<br/><br/>"
    "A <b>survival action</b>, brought by the decedent's estate, allows recovery for the "
    "damages the decedent himself could have recovered before death. This includes pre-death "
    "medical expenses and pain and suffering.<br/><br/>"
    "A <b>wrongful death action</b> is brought by the decedent's statutory beneficiaries "
    "(like a spouse) to recover for <b>their own losses</b> resulting from the death, such "
    "as loss of economic support and loss of consortium.<br/><br/>"
    "Here, Mrs. Crow can bring <b>both actions</b>. First, as the representative of Mr. "
    "Crow's estate, she can bring a <b>survival action</b> to recover for the damages Mr. "
    "Crow suffered during the two weeks between his injury and death -- his medical bills "
    "and pain and suffering. Second, Mrs. Crow can bring a <b>wrongful death action</b> in "
    "her own name to recover for her personal losses -- loss of Mr. Crow's financial support, "
    "services, and companionship (loss of consortium).",
    COOL_BG
))
story.append(Spacer(1, 6))

story.append(Paragraph("COMMENTARY", sLabel))
story.append(Paragraph(
    "This was your strongest issue -- you correctly identified wrongful death and reached "
    "a sound conclusion. But you missed a significant component that would have earned more "
    "points:<br/><br/>"
    "<b>You omitted the survival action entirely.</b> The prompt asked what claims Mrs. Crow "
    "can bring \"on behalf of herself <i>and</i> on behalf of Mr. Crow's estate.\" That "
    "\"and\" is a signal: there are two distinct claims. The wrongful death action is Mrs. "
    "Crow's <i>own</i> claim for her losses (loss of companionship, support). The survival "
    "action is the <i>estate's</i> claim for Mr. Crow's pre-death damages (medical bills, "
    "pain and suffering during those two weeks before he died).<br/><br/>"
    "<b>You also need to distinguish the damages.</b> The model answer explicitly separates "
    "what each action recovers. This distinction is a classic bar exam testing point -- "
    "graders are looking for you to recognize that these are two separate statutory actions "
    "with different plaintiffs (beneficiary vs. estate) and different damages.",
    sBody
))
story.append(Spacer(1, 4))

story.append(action_box(
    "<b>Build this habit:</b> When a prompt asks about claims after a death, always address "
    "<b>both</b>: <i>\"Mrs. [X] can bring two claims. First, a wrongful death action in her "
    "own name for [her losses: support, consortium]. Second, a survival action on behalf of "
    "the estate for [decedent's pre-death damages: medical bills, pain and suffering].\"</i> "
    "Stating both and distinguishing the damages is what earns full points."
))
story.append(Spacer(1, 8))


# ═══════════════════════════════════════════════════════════════════════
# CONCLUSORY vs. PROPER ANALYSIS
# ═══════════════════════════════════════════════════════════════════════
story.append(HRFlowable(width="100%", thickness=1.5, color=HexColor(GOLD),
                        spaceAfter=10, spaceBefore=10))

story.append(Paragraph("Conclusory Analysis vs. Proper Analysis", sH1))
story.append(Paragraph(
    "Below are four sentences from your essay rewritten to show the difference between "
    "asserting a conclusion and building toward one with element-by-element reasoning.",
    sBody
))
story.append(Spacer(1, 6))

# Rewrite 1
story.append(Paragraph("<b>1. Lifeguard's duty</b>", sH2))
story.extend(rewrite_pair(
    "\"Mr. Gopher will likely be found liable to Leo under vicariously liable by the "
    "Country Club and personally liable because Mr. Gopher mistakenly believed he had "
    "no duty.\"",

    "\"Generally, there is no affirmative duty to rescue a person in peril. However, a "
    "duty arises when an actor has a special relationship with the person in danger or "
    "has undertaken to provide protective services. Here, Mr. Gopher was an on-duty, "
    "certified lifeguard whose job was to monitor the pool and rescue anyone in distress. "
    "This role created an affirmative duty to act -- a duty that extends to all persons in "
    "the pool area regardless of their membership status. By watching Leo struggle and "
    "choosing not to intervene based on an incorrect belief that he owed no duty to a "
    "trespasser, Mr. Gopher breached this duty. His inaction was the actual and proximate "
    "cause of Leo's permanent lung damage.\""
))
story.append(Spacer(1, 8))

# Rewrite 2
story.append(Paragraph("<b>2. Parental liability vs. negligent entrustment</b>", sH2))
story.extend(rewrite_pair(
    "\"Ms. Fox allowing her son to drive the vehicle, without adult supervision with the "
    "past tickets and accidents puts Ms. Fox at fault for she was aware and knew her Son "
    "was not a safe driver.\"",

    "\"Under the theory of negligent entrustment, one who supplies a chattel to another "
    "whom the supplier knows or should know is likely to use it in a manner involving "
    "unreasonable risk of harm is liable for the resulting injury. Here, Ms. Fox knew "
    "that Ferret had received a speeding ticket and been found at fault in two accidents "
    "within the past year. This documented history gave her reason to know he was likely "
    "to drive negligently. By entrusting her car to him despite this knowledge, she "
    "supplied a dangerous instrumentality to a person she knew posed an unreasonable risk. "
    "Ferret's subsequent distracted driving and the fatal collision with Mr. Crow were "
    "the foreseeable type of harm that made the entrustment negligent.\""
))
story.append(Spacer(1, 8))

# Rewrite 3
story.append(Paragraph("<b>3. Club liability -- vicarious vs. direct</b>", sH2))
story.extend(rewrite_pair(
    "\"The Country Club will likely be found liable for Mr. Gopher's inaction, for Mr. "
    "Gopher was under the scope of employment within the employment guidelines.\"",

    "\"The Club is liable for negligent hiring -- a form of direct, not vicarious, "
    "liability. An employer has a duty to exercise reasonable care in hiring to ensure "
    "employees are fit for the position. The Club failed to conduct a background check on "
    "Mr. Gopher, which would have revealed he was fired from his previous lifeguarding "
    "job for failing to act during an emergency drill -- the exact same failure that "
    "caused Leo's injuries. By hiring an employee it knew or should have known was unfit "
    "for a safety-critical role, the Club breached its own duty of care.\""
))
story.append(Spacer(1, 8))

# Rewrite 4
story.append(Paragraph("<b>4. Wrongful death -- adding the survival action</b>", sH2))
story.extend(rewrite_pair(
    "\"Mrs. Crow would likely be able to present a wrongful death suit on behalf of "
    "herself and on behalf of Mr. Crow's estate.\"",

    "\"Mrs. Crow can bring two distinct claims. First, a wrongful death action in her "
    "own name as a statutory beneficiary to recover for her personal losses -- including "
    "loss of Mr. Crow's financial support, services, and companionship (loss of "
    "consortium). Second, a survival action on behalf of Mr. Crow's estate to recover "
    "the damages Mr. Crow could have claimed before his death -- including his medical "
    "expenses and pain and suffering during the two weeks between the accident and his "
    "death. These are two separate statutory causes of action with different plaintiffs "
    "and different recoverable damages.\""
))
story.append(Spacer(1, 10))


# ═══════════════════════════════════════════════════════════════════════
# CLOSING
# ═══════════════════════════════════════════════════════════════════════
story.append(thin_hr())

story.append(Paragraph(
    "Intesar, this is your fifth essay, and I want to be direct: this is a step backward "
    "from your Contracts and Business Associations essays (both Band 4). The Band 2 is not "
    "because you cannot do this -- your wrongful death analysis (0.90 issue score) proves "
    "you can. The problem is that you applied the wrong legal theories to two of three calls "
    "and missed the central issue the prompt was testing.<br/><br/>"
    "Three patterns to address immediately:<br/><br/>"
    "<b>1. Read the call before you write.</b> Call 1 asked whether <i>Mr. Gopher</i> is "
    "liable for <i>negligence</i>. That means: duty, breach, causation, damages -- applied "
    "to the lifeguard personally. You wrote about vicarious liability and attractive nuisance "
    "instead. Before writing, underline the key words in the call and make sure every "
    "paragraph in your answer addresses those words.<br/><br/>"
    "<b>2. Use the correct legal theory.</b> Negligent entrustment is not \"parental "
    "liability.\" Negligent hiring is not \"vicarious liability.\" These are distinct "
    "doctrines with distinct elements. When the facts give you someone handing a dangerous "
    "thing to a risky person, or an employer skipping a background check, those facts are "
    "pointing you to specific theories. Name the theory and state its elements.<br/><br/>"
    "<b>3. When a call says \"on behalf of herself <i>and</i> the estate,\" there are two "
    "claims.</b> The word \"and\" in a bar exam call is never decorative. It signals two "
    "separate analyses. Train yourself to see structural cues in the prompt.<br/><br/>"
    "Your wrongful death answer shows you have the analytical capacity. The issue is not "
    "ability -- it is issue recognition and theory selection. These are learnable skills. "
    "Keep writing.",
    sBody
))
story.append(Spacer(1, 14))

story.append(Paragraph("Bar Prep by SHEP&nbsp;&nbsp;|&nbsp;&nbsp;May 28, 2026", sFooter))

doc.build(story)
print(f"PDF generated: {OUTPUT_FILE}")
