/* Course content model - data-driven so <Lesson> stays generic.
   Modules 1 & 2 are authored in full (visible preview). Modules 3-6 carry only
   teaser metadata (locked). Block types are rendered by the <Block> dispatcher
   in lesson.jsx; figures are descriptors consumed by <Schema> in schemas.jsx.

   Voice: first-person senior engineer/leader who has been on the hiring side -
   warm but direct, reframes anxiety into an engineering problem, real numbers,
   every section lands on a one-liner. Inline **bold** / *italic* is supported. */

const MODULES_DATA = [
  /* ════════════════════════════════ MODULE 01 ════════════════════════════════ */
  {
    id: "module-1", n: "01", of: "06", track: "See the machine", locked: false, free: true,
    title: "Why your applications vanish",
    subtitle: "Before we fix a single line of your resume, you need to see the machine on the other side of “Submit” - where it actually rejects you, and where you still have leverage you’ve never used.",
    meta: ["~26 min read", "1 operating system to set up", "the lens for all 6 modules"],
    build: "You’ll leave this module with your **Funnel Ledger** filled in for the first time - one sheet that tells you, mathematically, which of three gates is killing your applications, so every later module is aimed instead of guessed.",
    teaserNext: { id: "module-2", line: "Next - the six ‘foreign signals’ that auto-reject your resume before a human reads one line about your skills." },

    sections: [
      {
        n: "01", eyebrow: "Clear the noise",
        title: "The four stories that keep you safe and stuck",
        lead: "Your brain is protecting you by blaming things outside your control. Let’s name the four stories, grant each its grain of truth - then notice they all point away from your leverage.",
        blocks: [
          { type: "p", text: "You’ve sent 80, maybe 150, maybe 250 applications. You tailored some. You stayed up rewriting your resume more than once. And the response has been… nothing. Not a no. Just silence. So your brain does the kind thing and hands you a reason. Here are the four it reaches for most." },
          { type: "lies", items: [
            { claim: "My English isn’t good enough.", grain: "A few specific language tells on paper do hurt you - we fix those in Module 2.", trap: "But a resume is cut in six seconds, long before anyone assesses your English in depth. Fluency is rarely what’s stopping the callbacks." },
            { claim: "I don’t have Canadian experience.", grain: "Recruiters really do say this.", trap: "It’s a symptom, not the disease - shorthand for four specific worries we’ll decode below. Fixable without a Canadian job already in hand." },
            { claim: "The market is bad.", grain: "Sometimes true at the margins.", trap: "People get hired in every market, including this one. Blaming the market is a quiet way to stop hunting for the variable you can actually control." },
            { claim: "They discriminate against newcomers.", grain: "Bias is real, and I won’t pretend otherwise.", trap: "But most of your silence isn’t a person rejecting you - it’s a system filtering you out before any person forms an opinion. Treat it as a fixable filter and you become dangerous." },
          ]},
          { type: "callout", tone: "insight", icon: "spark", text: "Notice the shape: every one of these points at something *outside* your control - which is exactly why the brain reaches for them. Call it the **Locus Tax**: every minute you spend on a cause you can’t change is a minute taxed off the one input you can. The reasons we’ll work with are the ones you control. All of them." },
          { type: "figure", figure: { kind: "locusFlip",
            external: ["Your accent & English", "Not having ‘Canadian experience’", "The job market", "Bias in hiring"],
            controllable: ["Which channel you apply through", "How your resume reads to 3 readers", "How much risk you appear to carry", "How many warm touches you make"] },
            caption: "Every arrow on the left costs you an arrow on the right." },
        ],
        oneLiner: "We work only with what you control - and that turns out to be almost everything that matters.",
      },
      {
        n: "02", eyebrow: "The machine",
        title: "Your application didn’t vanish. It got a six-second ‘no.’",
        lead: "It feels like your resume fell into a void. It didn’t. Here’s what actually happens after you hit submit.",
        blocks: [
          { type: "ul", items: [
            { lead: "It lands in an ATS.", text: "Applicant-tracking software parses and ranks resumes by keywords before a human is involved. If the parse fails or the keywords miss, you’re filtered out with no human ever seeing you." },
            { lead: "You join a crowd.", text: "For one decent role, roughly two-hundred-plus other people do exactly what you just did - often within the first 48 hours of the posting going live." },
            { lead: "A fast pass happens.", text: "A recruiter (or the ATS) gives each resume, famously, on the order of six to eight seconds of attention - if it gets human attention at all." },
            { lead: "They hunt for a reason to say no.", text: "With a stack that size, they aren’t looking for reasons to say yes. They’re looking for cheap, defensible reasons to shrink the pile fast." },
            { lead: "A handful reach a conversation. One gets the offer.", text: "So your resume didn’t disappear. It got a six-second decision and lost on a technicality." },
          ]},
          { type: "callout", tone: "quote", icon: "quote", text: "I’ll be honest about what that pass is. I’ve had a stack of 250 and an afternoon. I wasn’t asking “who’s brilliant here?” I was asking “who can I cut?” Wrong city, a gap with no story, a wall of grey text, a title that doesn’t add up - cut, cut, cut. It isn’t personal. It’s a filter running out of time." },
          { type: "p", text: "Sit with the gift hidden in that: **a person who is filtering can be beaten with signals. A person who is judging can’t.** You were never being judged. You were being filtered - and filters have rules." },
          { type: "figure", figure: { kind: "funnel",
            stages: [
              { label: "Applications for one role", value: 250 },
              { label: "Survive the 6-second scan", value: 50 },
              { label: "Real interviews", value: 6 },
              { label: "Offer", value: 1 },
            ],
            fastLane: { label: "Referral fast-lane", note: "A referred resume enters near the interview band - same person, different odds." } },
            caption: "The same resume performs completely differently depending on which door it walks through. (Counts are my calibration, not a study - yours will differ; the shape won’t.)" },
          { type: "h", text: "The cheap-no list - what those six seconds actually cut on" },
          { type: "p", text: "Since I’ve run that pass, here are the real triggers. The first few you’ve heard. The last three you probably haven’t - and they’re the ones quietly killing strong candidates:" },
          { type: "ul", items: [
            "No local city or +1 phone - reads as “not here yet.”",
            "An unexplained multi-month gap with no one-line reason.",
            "A wall of grey text with no numbers - nothing to grab in six seconds.",
            "A two-column or photo layout the parser already mangled (Module 2, Signal 1).",
            "A title that doesn’t match the level of the work.",
            { lead: "A numbered free-mail address", text: "like dev_chen_88@… - small thing, but it reads as “hasn’t localized.”" },
            { lead: "“References available on request”", text: "- a line that says nothing and signals padding." },
            { lead: "A skills section listing 30 technologies", text: "- it tells me you can’t prioritize, which is literally the job." },
          ]},
        ],
        oneLiner: "You weren’t being judged. You were being filtered - and filters have rules.",
      },
      {
        n: "03", eyebrow: "The leverage",
        title: "Not all applications are worth the same",
        lead: "Here’s the part almost nobody tells newcomers: the channel you apply through changes your odds by an order of magnitude. An application is not an application.",
        blocks: [
          { type: "ul", items: [
            { lead: "Cold apply (job boards).", text: "You’re one keyword-matched row in a spreadsheet of hundreds. Comfortable, frictionless, the worst return on your time. Fine as a baseline - not as the strategy." },
            { lead: "Recruiter inbound.", text: "Internal and agency recruiters are literally paid to fill roles. Optimize your LinkedIn and reply fast, and they bring roles to you. Warm, and largely passive once set up." },
            { lead: "Direct to the hiring manager.", text: "A specific, thoughtful message to the person who owns the role. Low volume, but you bypass the queue and land in front of the decision-maker." },
            { lead: "Referral.", text: "Someone inside puts your name forward. Your resume gets pulled from the stack and, at many companies, is guaranteed a human look. The single highest-conversion channel that exists - and the one newcomers assume is closed to them. It isn’t. That’s all of Module 3." },
          ]},
          { type: "figure", figure: { kind: "channelBars",
            bars: [
              { label: "Cold apply (job boards)", value: 12, tone: "cold", note: "most effort, worst odds" },
              { label: "Recruiter inbound", value: 42, tone: "cold", note: "they’re paid to place you" },
              { label: "Direct to hiring manager", value: 64, tone: "warm", note: "skip the queue" },
              { label: "Referral", value: 90, tone: "hot", note: "near-guaranteed human read" },
            ] },
            caption: "Warmer beats more - and it’s not close. Bar lengths are relative odds, not exact percentages." },
          { type: "h", text: "The math that should change your week" },
          { type: "p", text: "Spend ten hours on ~100 cold applies and you might earn two or three screens. Spend the same ten hours earning ~10 genuine referrals and you earn three or four screens - **and they skip the ATS gate entirely.** Same hours, better gate, better odds. You don’t have an application problem. You have an *allocation* problem." },
          { type: "callout", tone: "insight", icon: "target", text: "Carry one number forward: the **Warm Index (0-100).** Score each application by channel - cold ≈10, recruiter-inbound ≈40, direct-to-manager ≈65, referral ≈90. Your weekly goal stops being “apply to more” and becomes “raise my average Warm Index above 45.” (Those scores are *my* calibration - a deliberate ranking, not a measurement. Keep the order; tune the gaps to your own results.)" },
        ],
        oneLiner: "You don’t have an application problem. You have an allocation problem.",
      },
      {
        n: "04", eyebrow: "The diagnosis",
        title: "The three real reasons you’re not getting callbacks",
        lead: "Strip away the four stories and the silence almost always comes down to three things. None is flattering. All three are things you can change - and the rest of this course changes them, in order.",
        blocks: [
          { type: "reasons", items: [
            { n: "01", title: "You’re spending 90% of your effort on the channel with the worst odds.",
              looksLike: "200 Easy-Apply submissions in six weeks. Three auto-rejections, the rest silence. The candidate concludes “no one wants to hire me,” when the truth is they ran the wrong play 200 times.",
              isThisYou: "If your funnel is many applications and almost no replies, and nearly all came from job boards - this is your number-one problem, full stop.",
              fixedIn: "module-3", fixedLabel: "Rebuilt in Module 03" },
            { n: "02", title: "Your resume is written for a reader who doesn’t exist.",
              looksLike: "There isn’t one reader - there are three, in sequence: the ATS (a keyword parser), the recruiter (a six-second pattern-match), and the hiring manager (someone hunting for evidence). Most newcomer resumes are written in a fourth style: dense, duties-based, formatted to the conventions of home.",
              isThisYou: "If you’re clearly qualified but board applications die silently, or human replies fizzle fast - your resume is failing a gate before your ability is ever judged.",
              fixedIn: "module-2", fixedLabel: "Fixed in Module 02 - the very next lesson" },
            { n: "03", title: "On paper, you’re the riskiest candidate in the stack - and nobody told you.",
              looksLike: "Two strong finalists. One came through a referral with a Canadian reference the manager can call; the other is an unknown name with an overseas phone number. The work is comparable. The referred one gets the offer - not because they’re better, but because they’re *safer*.",
              isThisYou: "If you reach screens but consistently stall, or keep feeling like “the backup choice” - you’re being read as higher-risk. The whole course is built to lower that.",
              fixedIn: "module-2", fixedLabel: "Lowered across Modules 02-05" },
          ]},
          { type: "callout", tone: "insight", icon: "badge", text: "On reason 3, here’s the math in the manager’s head, whether they’d say it aloud or not: a bad hire costs me three months of my own time plus the team’s, and a req I have to run again. So when two resumes look similar and one came warm through someone I trust, the safe choice is obvious. **You’re not fighting bias there - you’re fighting a rational fear. Name it and lower it; don’t plead with it.**" },
          { type: "p", text: "Reason 2 is worth a closer look, because it’s the one you can fix this week. Your resume has *three* readers, each with a different job. Write for the average of them and you serve none." },
          { type: "figure", figure: { kind: "threeReaders",
            readers: [
              { name: "The Parser (ATS)", icon: "code", time: "milliseconds", who: "Software, not a person", wants: "clean text it can map to Title · Company · Dates, and keyword overlap with the posting" },
              { name: "The Recruiter", icon: "user", time: "6-8 seconds", who: "A fast human screen", wants: "a quick yes - right level, right location, numbers that pop, no cheap reason to say no" },
              { name: "The Hiring Manager", icon: "badge", time: "1-2 min, later", who: "The engineer you’d work with", wants: "evidence you can do *their* job - real scope, real systems, believable results" },
            ] },
            caption: "Three readers, three incompatible needs, one page. The gaps between them are exactly where you’re being rejected." },
        ],
        oneLiner: "Three causes, all fixable, all yours - the rest of the course just works through them in order.",
      },
      {
        n: "05", eyebrow: "Decode the phrase",
        title: "“Canadian experience” is a checklist, not a wall",
        lead: "The sentence that breaks newcomers’ morale is really four checkable worries wearing one intimidating coat. Decode them and you can answer each directly - without already holding a Canadian job.",
        blocks: [
          { type: "decode", items: [
            { worry: "Will they communicate the way our teams do?", signal: "A localized resume and LinkedIn, clean written English, and how you show up on the screen (Module 4 drills this)." },
            { worry: "Do they actually understand how work happens here?", signal: "Get any local footprint, fast - a short contract, a visible open-source contribution, volunteering your skills for a Canadian nonprofit. Even brief engagements reset this clock." },
            { worry: "Can I check references someone here trusts?", signal: "Build one credible local reference early - a contract manager, a meetup mentor, a bootcamp lead. One recognized name de-risks you enormously." },
            { worry: "How risky and costly is this hire to onboard?", signal: "Proof of impact on the resume, a referral in the door, and a clear “authorized to work” line. Risk down, callback up." },
          ]},
          { type: "callout", tone: "insight", icon: "globe", text: "Here’s the reframe that changes your whole search: **they’re not asking you to *have* Canadian experience - they’re asking you to be *legible.*** Experience takes years. Legibility you can produce this month. Hold onto that word - *legible* - it’s the entire job of Module 2." },
        ],
        oneLiner: "It was never a wall. It was a form nobody had handed you.",
      },
      {
        n: "06", eyebrow: "The shift",
        title: "Run your search like an engineer, not a defendant",
        lead: "Two questions. Read them slowly and notice how differently they land.",
        blocks: [
          { type: "p", text: "**“Why won’t anyone hire me?”** - passive, personal, has no answer, and quietly dismantles your confidence over months of silence. **“Which gate am I failing, and what’s the one specific fix?”** - active, diagnostic, and it has a real answer every single time. The first is a feeling. The second is an engineering problem - and you already know how to solve those, because that’s literally the job you’re applying for." },
          { type: "figure", figure: { kind: "threeGates",
            gates: [
              { name: "The ATS", icon: "code", symptom: "Auto-rejects in minutes - or pure silence", fixedIn: "Module 02" },
              { name: "The recruiter", icon: "user", symptom: "Screens, but recruiters don’t call back", fixedIn: "Modules 02 + 04" },
              { name: "The hiring manager", icon: "badge", symptom: "Calls, but no onsites or offers", fixedIn: "Modules 04-06" },
            ] },
            caption: "You don’t have a ‘job search problem.’ You have a specific gate that’s failing. Find it." },
          { type: "p", text: "Read your own symptom off that diagram. Auto-rejects within hours → ATS gate. Screens but no recruiter callbacks → recruiter gate. Recruiter calls but no onsites → hiring-manager gate." },
          { type: "callout", tone: "warning", icon: "spark", text: "Two cases the clean version misses - and they’re the *common* ones. **Mostly silence, not even auto-rejects?** That’s not a fourth gate; it’s the ATS gate plus the cold-channel problem - you’re not ranking high enough to even earn the auto-no. Silence usually means *cold + unparseable.* **Failing all three at once?** Don’t panic-fix everything. The top gate gates everything below it - start at the ATS, because nothing downstream gets to matter until you’re through it." },
          { type: "p", text: "And like any system you run, it needs a cadence - a weekly loop that turns a vague, anxious “I’m job hunting” into a tight feedback machine. The one rule that makes it work: **change exactly one variable at a time.** Change five and you stay confused for six months." },
          { type: "figure", figure: { kind: "weeklyLoop",
            steps: [
              { label: "Set input targets", icon: "target" },
              { label: "Apply in batches", icon: "doc" },
              { label: "Log the funnel", icon: "map" },
              { label: "Find the failing gate", icon: "globe" },
              { label: "Change ONE variable", icon: "bolt" },
            ] },
            caption: "Change one variable at a time. That’s how you learn what’s actually moving your numbers." },
        ],
        oneLiner: "You’re not unlucky. You’re un-instrumented.",
      },
      {
        n: "07", eyebrow: "The long game",
        title: "Protect your morale like a production input",
        lead: "One last thing, and I mean it as someone who’s watched a lot of talented people nearly quit the week before an offer landed: your morale is not a mood to ignore. It’s a measurable input - and when it collapses, your output goes with it.",
        blocks: [
          { type: "ul", items: [
            { lead: "Expect months, not weeks.", text: "A three-to-six-month search is normal here, longer as a newcomer building local signal from scratch. Knowing that up front stops every quiet week from registering as failure." },
            { lead: "Score on process, not outcomes.", text: "You can’t control offers. You can control ‘10 quality applications, 5 referral asks, 2 hiring-manager messages this week.’ Hit your inputs and the outputs follow." },
            { lead: "Batch the work.", text: "Applying in focused blocks - and logging it - beats refreshing job boards all day, which mostly just sands down your morale and teaches you nothing." },
            { lead: "Separate the signal from the silence.", text: "Silence is the system, not a verdict. Save the real signal - interviews, recruiter feedback, a specific ‘no, because…’ - and learn only from that." },
            { lead: "Keep the parts of your life that keep you steady.", text: "A rested, grounded person interviews far better than a desperate one, and interviewers feel the difference across a screen. Protecting your week is also strategy." },
          ]},
          { type: "callout", tone: "insight", icon: "bolt", text: "So instrument morale like everything else, with an **Input Score**: targets hit ÷ targets set. A week where you hit every input and heard nothing back is **not** a failure - it’s a *won week*, because you changed the only thing that was ever yours to change. (In my experience the quit usually comes around week six - not a statistic, just a pattern I’ve watched too many times. The Input Score is the thing that gets you past it.)" },
          { type: "h", text: "Common mistakes that keep good people stuck" },
          { type: "ul", items: [
            "Polishing the resume for the tenth time while never touching the channel - optimizing the wrong gate.",
            "Applying only to roles you’re 95% qualified for. Apply at 60-70% too; postings are wish-lists, not requirements.",
            "No tracking - so you genuinely can’t tell which gate is failing, and every fix is a guess.",
            "Reading every rejection as personal feedback. Most are noise from an overloaded funnel.",
            "Changing everything at once, so you never learn which change moved the number.",
          ]},
        ],
        oneLiner: "Win the week you can actually win, and the months take care of themselves.",
      },
    ],

    assignment: {
      title: "Your Week-1 operating system",
      intro: "You can’t fix what you don’t measure. Set this up before Module 2 - it’s the instrument panel for the entire course. You’ll finish it already holding a diagnosis.",
      steps: [
        { lead: "Build your Funnel Ledger.", text: "Backfill your last 10-20 applications into the table below - Company · Channel · Warm Index · Outcome · Gate it died at." },
        { lead: "Run the Three-Gate Diagnostic.", text: "From the Outcome column, name your primary failing gate. Write one sentence: “My applications are dying at the ___ gate.”" },
        { lead: "Compute two numbers.", text: "Your average Warm Index (are you living in the cold pile?) and your 6-second survival rate (replies ÷ total). Those two numbers *are* your diagnosis." },
        { lead: "Set this week’s inputs + the one variable.", text: "Pick input targets you control (e.g. 5 warm-channel touches, average Warm Index ≥ 45) and name the single variable you’ll change next week. Nothing else changes - that’s the rule." },
      ],
      blocks: [
        { type: "h", text: "Your Funnel Ledger - a worked example (yours will look different)" },
        { type: "table", note: "Five rows in and the shape already talks: everything cold died at the ATS, the one referral went all the way. Your ledger will say something just as specific.",
          cols: ["Company", "Channel", "Warm Index", "Outcome", "Died at gate"],
          rows: [
            ["Maplebyte", "Cold / job board", "10", "No reply", "ATS / cold"],
            ["Northgrid", "Cold / job board", "10", "Auto-reject (2h)", "ATS"],
            ["Voyageur", "Recruiter inbound", "40", "Phone screen → no", "Recruiter"],
            ["Lakeshore", "Direct to manager", "65", "Reply, then ghosted", "Recruiter"],
            ["Tundra Labs", "Referral (ex-colleague)", "90", "Onsite → offer", "-"],
          ] },
        { type: "h", text: "Rough benchmarks - a sanity check, not gospel" },
        { type: "table", note: "Directional, from my own hiring - not a study. The gap that matters is the first row; the rest are roughly channel-blind. Tune them to your own ledger after two weeks.",
          cols: ["Step", "Cold", "Warm / referred"],
          rows: [
            ["Resume → screen", "low single digits", "often ~10× higher"],
            ["Screen → technical", "~40-60%", "~40-60%"],
            ["Technical → onsite", "~40-60%", "~40-60%"],
            ["Onsite → offer", "~20-35%", "~20-35%"],
          ] },
      ],
    },
  },

  /* ════════════════════════════════ MODULE 02 ════════════════════════════════ */
  {
    id: "module-2", n: "02", of: "06", track: "Become legible", locked: false,
    title: "The six ‘foreign signals’ that auto-reject your resume",
    subtitle: "Your resume isn’t weak - it’s *unreadable* to the three readers it has to pass. Here’s how to translate a foreign career into the language a Canadian pipeline actually parses, in seconds, without lying about a thing.",
    meta: ["~30 min read", "1 resume + 1 LinkedIn rebuilt", "the surface every other module pushes through"],
    build: "You don’t finish this module with notes. You finish it with a **new document** - one rebuilt, parser-clean, recruiter-scannable resume and one localized LinkedIn profile.",
    teaserNext: { id: "module-3", line: "Next - a localized resume gets you *read*. Module 3 gets you *referred*, so the read happens through the warm door." },

    sections: [
      {
        n: "01", eyebrow: "Clear the noise",
        title: "Four things that are true - and still killing you",
        lead: "Module 1 cleared away four comforting lies. This one is harder, because these four are *true* - and being right about them is exactly what keeps you stuck.",
        blocks: [
          { type: "lies", items: [
            { claim: "You really are qualified.", grain: "True - you’ve shipped real systems and led real people.", trap: "But qualification you can’t *see* in six seconds doesn’t exist to the reader. Legibility, not competence, is the gate." },
            { claim: "Your resume looks professional.", grain: "It’s clean, designed, maybe built in a slick template.", trap: "That template is probably two-column - which is exactly what the parser scrambles into nonsense. Pretty is getting you parsed wrong." },
            { claim: "You did important work.", grain: "You did - big systems, real scale.", trap: "But ‘responsible for’ describes the chair you sat in, not the dent you made. No number, no signal." },
            { claim: "You just need to apply to more places.", grain: "Volume feels like progress.", trap: "Module 1’s lesson holds: warmer beats more. This module makes the warm read *land* - so a hard-won referral isn’t wasted on a resume that can’t pass." },
          ]},
          { type: "callout", tone: "insight", icon: "spark", text: "Every one of those points away from the one surface you fully control: the document. So that’s where we work. The reframe for the whole module: your resume isn’t bad - it’s *foreign*, written fluently in a language this pipeline doesn’t read. ‘Unreadable’ is not a verdict on your career. It’s a formatting bug. And bugs have fixes." },
        ],
        oneLiner: "It’s not weak. It’s unreadable - and unreadable is fixable.",
      },
      {
        n: "02", eyebrow: "The machine",
        title: "How a resume actually gets read",
        lead: "I’ve been on the other side of that table. I’ve opened the PDF, scrolled for six seconds, and quietly moved it to the no pile - not because the person was weak, but because I couldn’t find the one thing I was hunting for fast enough.",
        blocks: [
          { type: "p", text: "Your resume is read three times, by three readers with incompatible needs. Write for one and you lose the other two. The whole craft is satisfying all three - on one page." },
          { type: "figure", figure: { kind: "threeReaders",
            readers: [
              { name: "The Parser (ATS)", icon: "code", time: "milliseconds", who: "Software, not a person", wants: "clean text it can map to Title · Company · Dates, plus keyword overlap with the posting" },
              { name: "The Recruiter", icon: "user", time: "6-8 seconds", who: "A non-technical screener", wants: "a fast yes - right level, right location, numbers that pop" },
              { name: "The Hiring Manager", icon: "badge", time: "1-2 min, later", who: "The engineer you’d work with", wants: "evidence you can do their job - real scope, believable results" },
            ] },
            caption: "The trap: newcomers over-optimize for the parser (keyword-stuff) and lose the recruiter - or write a beautiful human story the parser can’t even ingest. The six signals are exactly where the three readers conflict." },
          { type: "callout", tone: "quote", icon: "quote", text: "Here’s the message you never see. A recruiter pings the hiring manager: “got one with strong experience but it’s all foreign - ICBC? - and the resume’s a bit of a mess, want me to pass or do you want to look?” Half the time the manager says pass, because they’re busy and the recruiter already planted the doubt. **Your six signals are what wrote that message. Fix them and that DM never gets sent.**" },
        ],
        oneLiner: "Three readers, three incompatible needs, one page.",
      },
      {
        n: "03", eyebrow: "The six signals",
        title: "The auto-reject surface",
        lead: "These are the six strongest, real signals - ordered from machine-fatal to human-hesitation, which is the order of leverage. Each one: what it is, why it hurts (and to which reader), and the exact fix.",
        blocks: [
          { type: "signals", items: [
            { n: "1", name: "The unparseable layout (columns, tables, photo)",
              what: "The beautiful two-column template - sidebar skills bars, a header block, a profile photo, icons next to each section.",
              why: "The ATS reads top-to-bottom, left-to-right as one stream. Two columns get spliced into nonsense; your job title lands next to a random skill, and the parser can’t fill its Title · Company · Dates fields - so your experience doesn’t exist in the system the recruiter searches. Text in headers/footers and images is often dropped entirely. The photo costs you twice: many recruiters are trained to discard photo resumes to avoid bias-liability.",
              fix: "Single column. No tables, text boxes, sidebars, header/footer regions, photo, or icons-as-information. Real selectable text, standard headings (“Experience”, “Skills”, “Education”), exported as a text-based PDF. Save the visual flair for your portfolio site.",
              before: "Two-column PDF, photo top-left, skills as little progress bars.",
              after: "One column, no photo, a plain comma-separated SKILLS line, role title as bold text on its own line." },
            { n: "2", name: "Foreign formatting fingerprints",
              what: "A +86 / +91 / +234 phone, a full home-country street address, dates as 12.05.2023, budgets in EUR/CNY/INR, mixed British spelling.",
              why: "A foreign phone and address are the recruiter’s fastest ‘is this person here and authorized?’ trigger - manufactured doubt before they’ve read a thing. DD/MM dates break ATS date parsing (and your computed years of experience). Foreign currency makes your wins un-weighable - nobody converts €4M in their head.",
              fix: "Phone in +1 local format; address → City, Province only; dates as Mon YYYY; money in CAD or portable units (users, req/s, %). Pick one spelling system: Canadian in prose (colour, behaviour), American in code identifiers (color, optimize) because that’s what the libraries use. If unsure, match the posting.",
              before: "+86 138 0013 8000 · Shenzhen, China, Nanshan District · spearheaded a ¥30M migration",
              after: "+1 (647) 555-0192 · Toronto, ON · spearheaded a ~$3M CAD platform migration" },
            { n: "3", name: "Untranslated employer scale",
              what: "A company that was a household name back home but reads here as an unknown logo - or a strong employer described with zero context.",
              why: "A recruiter calibrates seniority partly by where you’ve worked. If the brand carries no weight here, the borrowed credibility evaporates - a staff engineer from a national platform reads like a junior from a no-name shop. The hiring manager loses the fastest proxy for ‘has operated at our scale.’",
              fix: "Translate the employer into a one-line scale descriptor, and anchor it to a Canadian name the reader already calibrates on: “ICBC - China’s largest bank, think RBC-scale for that market, 100M+ customers.” Now the next bullet about 8k req/s lands as believable, because you’ve set the stage it happened on.",
              before: "Software Engineer, ICBC - 2018-2022",
              after: "Software Engineer · ICBC (China’s largest bank - think RBC-scale, 100M+ customers)" },
            { n: "4", name: "Non-localized or inflated job titles",
              what: "Literal translations that don’t map to North-American leveling: ‘Senior Engineer, Grade A’, ‘R&D Engineer, Level T7’, ‘Programmer’, ‘Technical Director’ (of a three-person team).",
              why: "Recruiters search by title keywords. If your title isn’t a string they search (‘Senior Software Engineer’, ‘Backend Engineer’), you never surface - a parse-and-search failure as fatal as Signal 1. A title that mismatches the work either undersells you (filtered as junior) or flags you (filtered as inflated).",
              fix: "Map each title to its closest standard North-American equivalent, calibrated to scope, not the literal word. Lead with the localized title; footnote the original where it differs, for integrity.",
              before: "Senior Engineer, Grade A (you owned a 6-person team and the architecture)",
              after: "Senior Software Engineer / Tech Lead (local equivalent of “Senior Engineer, Grade A”)" },
            { n: "5", name: "Duties, not impact",
              what: "Bullets describing the job description you were handed, not the dent you made: ‘Responsible for the frontend’, ‘Participated in the development of…’.",
              why: "The six-second scan hunts for outcomes and numbers. A duties list gives nothing to grab - everyone ‘was responsible for’ something, so you become indistinguishable from the stack. The hiring manager wants evidence; ‘responsible for’ describes a chair you occupied, not a result you caused.",
              fix: "The impact-and-stack formula (next section): verb → what you built → number → stack. Lead with the number. Put one in every bullet you possibly can.",
              before: "Responsible for working on the frontend of the application",
              after: "Rebuilt the checkout flow in React/TypeScript, cutting load time 2.4s → 0.9s and lifting conversion +12%" },
            { n: "6", name: "Home-country personal-data conventions",
              what: "The CV header block from many countries: date of birth, marital status, number of children, nationality, gender, a full address, sometimes a headshot.",
              why: "North-American hiring is structured to avoid collecting age / marital / nationality data - it’s bias-liability. A recruiter who sees it reads the document as foreign-formatted and, in some shops, must literally set it aside to keep a clean process. It also signals ‘hasn’t localized yet,’ compounding every other signal.",
              fix: "Delete all of it. Top block = Name · target role title · City, Province · +1 phone · email · LinkedIn/GitHub. Nothing else. The one good exception: if work authorization matters for the role, a single neutral line - “Eligible to work in Canada (PR)” - adds signal.",
              before: "Name · DOB: 14.03.1990 · Married, 2 children · Nationality: Indian · [photo]",
              after: "Priya Nair · Senior Backend Engineer · Toronto, ON · +1 (416) 555-0148 · Eligible to work in Canada (PR)" },
          ]},
          { type: "callout", tone: "insight", icon: "globe", text: "A few of these - the photo, the full address, the date of birth - aren’t mistakes back home. They’re the correct, expected convention. This isn’t about right and wrong; it’s about which document you’re holding. **Right at home, wrong document for here.**" },
          { type: "callout", tone: "warning", icon: "chat", text: "On the phone number (Signal 2), the practical how: get a free Canadian number day one with **Fongo** or **TextNow**, or a local **eSIM**. One gotcha - Google Voice doesn’t hand out new Canadian numbers, so don’t wait on it. A +1 number is the cheapest signal you’ll ever buy." },
          { type: "figure", figure: { kind: "sixSignals",
            signals: [
              { label: "Unparseable layout", fix: "Single column, real text, no tables / photo / icons - so the parser can map Title · Company · Dates." },
              { label: "Foreign formatting", fix: "+1 phone, City, ON, Mon YYYY dates, CAD or portable units, one spelling system." },
              { label: "Untranslated employer", fix: "Add a one-line scale anchor: “China’s largest bank - think RBC-scale.”" },
              { label: "Mistranslated title", fix: "Map to the standard North-American title; calibrate to scope, not the literal word." },
              { label: "Duties, not impact", fix: "Every bullet: verb → what you built → number → stack. Front-load the number." },
              { label: "Personal-data block", fix: "Delete DOB, marital status, nationality, photo, full address. Right at home, wrong document here." },
            ] },
            caption: "Tap a pin to see the fix. Six points where the three readers conflict - and six places to win all three at once." },
        ],
        oneLiner: "Right at home, wrong document for here.",
      },
      {
        n: "04", eyebrow: "The formula",
        title: "Impact-and-stack - the only thing a recruiter actually reads",
        lead: "Signal 5 is the single highest-payoff fix, so it gets its own section. There’s one formula, and once you see it you can’t unsee it.",
        blocks: [
          { type: "figure", figure: { kind: "impactFormula",
            parts: [
              { label: "Strong verb", hint: "Built, cut, scaled, led…" },
              { label: "What you built", hint: "the system or change" },
              { label: "Number", hint: "%, ms, $, users", accent: true },
              { label: "Stack", hint: "React, Node, AWS" },
            ] },
            caption: "Four parts, in this priority. If you have a number, front-load it - the eye catches digits first in a scan." },
          { type: "ul", items: [
            { lead: "Verb first, never ‘responsible for.’", text: "Built, shipped, cut, scaled, led, migrated, automated, reduced, drove." },
            { lead: "A number in every bullet you can.", text: "%, time, money (CAD), throughput, users, headcount, error-rate. Honest-but-estimated beats absent - ‘roughly halved’ is a number; ‘improved performance’ is not." },
            { lead: "Stack as proof, not decoration.", text: "Naming React/Node/PostgreSQL/AWS does double duty: it’s the ATS keyword and it’s evidence the result is real." },
            { lead: "Tie the metric to a business outcome", text: "where you can: load time → conversion; latency → retention; pipeline time → release frequency." },
          ]},
          { type: "figure", figure: { kind: "beforeAfterBullet",
            before: "Responsible for working on the frontend of the application",
            after: "Cut first-load 2.4s → 0.9s by code-splitting a React/TypeScript SPA, lifting checkout conversion +12%",
            issue: "No impact, no number, no stack - nothing for a six-second scan to grab." },
            caption: "Same job. One version is a chair you sat in; the other is a result they can picture on their team." },
          { type: "table", title: "Three rewrites - vague duty → quantified impact", note: "Estimated-but-honest is the standard. If you don’t know the exact figure, give a defensible range you’d stand behind in an interview.",
            cols: ["Before (duty)", "After (impact-and-stack)"],
            rows: [
              ["Responsible for working on the frontend", "Cut first-load 2.4s → 0.9s by code-splitting a React/TS SPA, lifting checkout conversion +12%"],
              ["Did backend tasks using various technologies", "Built Node/PostgreSQL APIs serving 1.2M requests/day at p99 <120ms, replacing a legacy PHP monolith"],
              ["Worked in a team on different projects", "Led a 4-engineer squad to ship a checkout rebuild 6 weeks early, cutting payment-failure 3.1% → 0.7%"],
            ] },
        ],
        oneLiner: "A recruiter doesn’t read what you did - they scan for what moved. Give them a number to grab.",
      },
      {
        n: "05", eyebrow: "Decode the phrase",
        title: "What resume-feedback phrases actually mean",
        lead: "When a polite ‘no’ does come with words, it’s rarely literal. Three of the most common ones decode straight into signals your resume can answer.",
        blocks: [
          { type: "decode", items: [
            { worry: "“We went with someone with more *relevant* experience.”", signal: "Relevance is a keyword-and-framing problem, not a years problem. Mirror the posting’s exact stack and domain words in your bullets so the overlap is obvious." },
            { worry: "“Not quite the right *level.*”", signal: "Your title and scope are mismatched. Calibrate the title to the work and put scope *in* the bullets - team size, system scale - so the level is unambiguous." },
            { worry: "“We’re looking for strong *communication.*”", signal: "Your bullets ARE the writing sample. Short, specific, outcome-first lines read as a clear communicator; dense duty-paragraphs read as the opposite." },
          ]},
          { type: "callout", tone: "insight", icon: "doc", text: "‘Culture fit’ and ‘communication’ start on the resume, not in the room. By the time you’re in the interview the reader has already formed a guess - from the page. Make the page say *legible, leveled, low-risk.*" },
        ],
        oneLiner: "The polite no is usually a signal you forgot to send.",
      },
      {
        n: "06", eyebrow: "The doppelgänger",
        title: "Localize LinkedIn - the resume that goes out and gets found",
        lead: "Your resume waits to be opened. Your LinkedIn goes out and gets *found* - it’s the surface recruiters search first. Same six signals apply, plus a few fields unique to it.",
        blocks: [
          { type: "ul", items: [
            { lead: "Headline.", text: "The default ‘[Title] at [Company]’ wastes the single most-searched field. Rewrite to target title · core stack · value cue - e.g. ‘Senior Backend Engineer · Node, Go, PostgreSQL · scaling fintech systems.’ Keyword fuel and a six-second value statement at once." },
            { lead: "Location.", text: "Set it to the Canadian city you’re targeting, where you are or are genuinely moving. Recruiters filter searches by location; a foreign location filters you out of every local search before you exist. (Set it to where you truly are or will be - don’t fabricate.)" },
            { lead: "Open to work - the part everyone gets wrong.", text: "LinkedIn has two separate modes. The public green photo frame (everyone sees it, and to some hiring managers it reads as desperate) and the private ‘Share with recruiters only’ setting (visible only to recruiter-seat holders). Use the **private** one, with your localized titles and city, so you surface in their paid searches without flagging it to your current employer." },
            { lead: "About.", text: "Three short first-person paragraphs: who you are and the scale you’ve operated at; two or three quantified wins (reuse your resume bullets); what you want in Canada and how to reach you. Mirror the resume’s keywords so search finds you." },
          ]},
          { type: "callout", tone: "insight", icon: "target", text: "Stop guessing whether a resume ‘matches’ a role and measure it: list the posting’s must-have keywords and titles, then check how many appear, honestly, in your resume. Close the gaps you can truthfully close." },
          { type: "figure", figure: { kind: "keywordMeter", score: 78, label: "Overlap between your resume and this one posting - measure it, don’t guess." },
            caption: "Run the meter per target role. A localized resume plus a localized LinkedIn tell one consistent story to the search." },
        ],
        oneLiner: "Your resume waits to be opened. Your LinkedIn goes out and gets found.",
      },
      {
        n: "07", eyebrow: "Run it like an engineer",
        title: "The weekly positioning loop",
        lead: "Same engine as Module 1, aimed at the resume. Stop asking ‘is my resume good?’ (unanswerable, breaks you) and start asking ‘which reader am I failing, and what’s the one signal to fix?’",
        blocks: [
          { type: "figure", figure: { kind: "weeklyLoop",
            steps: [
              { label: "Pick 3 target postings", icon: "target" },
              { label: "Mirror their keywords & titles", icon: "doc" },
              { label: "Run the six-signal pass", icon: "check" },
              { label: "Score the match meter", icon: "globe" },
              { label: "Send, log callback rate", icon: "arrow" },
            ] },
            caption: "One variable at a time - just like the funnel loop. Change five things and you’ll never know which one moved the number." },
          { type: "p", text: "Score the only thing that matters here: **callbacks per ten sends.** Not whether the resume *feels* done - it never will, because it isn’t a monument, it’s an instrument. You’ll keep a tailored variant per role family, re-measure, and watch the number move." },
        ],
        oneLiner: "Stop asking ‘is my resume good?’ Ask ‘which reader am I failing?’",
      },
      {
        n: "08", eyebrow: "The long game",
        title: "The edge cases, the ethics, and when to ship",
        lead: "Before the assignment, the questions you’re actually worried about - the ones a generic guide skips, and the ones that cause quiet refunds when they’re ignored.",
        blocks: [
          { type: "decode", items: [
            { worry: "The relocation gap (6-14 months of ‘arrived, settled, job-hunting’).", signal: "Name it in one line - ‘2024 - Relocated to Canada; contract work & upskilling.’ A named gap reads as a decision; a silent one reads as a problem." },
            { worry: "A foreign or non-CS degree.", signal: "Add one line: ‘B.Sc. Computer Science, [University] (WES-evaluated, equivalent to a Canadian bachelor’s).’ The WES line quietly answers a question the reader would otherwise guess at." },
            { worry: "An employer that no longer exists or can’t be verified.", signal: "Add the scale anchor and a reachable reference - a former manager on LinkedIn - so ‘can I verify this?’ has an answer before it’s asked." },
            { worry: "My written English genuinely wavers.", signal: "The resume tests *written* register, which is fixable fast - this module does it. Spoken fluency is a different muscle and it’s the interview’s job (Module 4). Have one fluent friend read your final bullets aloud; cut anything that trips them." },
          ]},
          { type: "callout", tone: "insight", icon: "check", text: "And the question under all of this: *is this lying?* No. Re-titling ‘Senior Engineer, Grade A’ to ‘Senior Software Engineer / Tech Lead’ is **translation**, as long as the scope bullets underneath are true. The line is simple: never invent a result, a number, or a responsibility you didn’t hold. Stay on the right side of it and you’re also protected when references get checked - which is the real reason to stay honest, beyond ethics." },
          { type: "h", text: "Common mistakes" },
          { type: "ul", items: [
            "Keyword-stuffing for the parser until the recruiter can’t read you.",
            "Inflating a title past the scope the bullets can defend.",
            "One resume for every role - instead of mirroring each posting’s words.",
            "Deleting your numbers because they feel like bragging. Here, no number means no signal.",
            "Leaving LinkedIn un-localized while the resume is perfect - you’re still invisible to search.",
          ]},
          { type: "callout", tone: "warning", icon: "bolt", text: "You’re an engineer; you’ll polish this forever. Don’t. When every bullet has a verb and (where possible) a number, the layout is single-column and parser-clean, and the top block is localized - **ship it.** A sent good resume beats a perfect unsent one. Iterate from real callback data, not from the chair." },
        ],
        oneLiner: "You don’t finish this module with notes. You finish it with a new document.",
      },
    ],

    assignment: {
      title: "Your Week-2 resume teardown",
      intro: "Run your own resume through this, line by line, this week. You finish holding one rebuilt resume and one localized LinkedIn - not a to-do list.",
      steps: [
        { lead: "The six-signal pass (top to bottom).", text: "Copy-paste your PDF into a plain notepad - if the order scrambles, collapse to single column. Then fix formatting, add employer scale anchors, localize titles, rewrite every bullet with the formula, and delete the personal-data block." },
        { lead: "The match-meter check (per target role).", text: "Paste a real posting beside your resume; list its must-have keywords and title; check overlap; close the gaps you can truthfully close." },
        { lead: "LinkedIn localization.", text: "Rewrite the headline (title · stack · value), set location to your Canadian city, enable recruiter-only Open-to-Work with localized titles, and rewrite the three-paragraph About." },
        { lead: "Score it.", text: "Note today’s callbacks-per-10-sends baseline, then change exactly one variable next week. Track it like the Module 1 funnel." },
      ],
      blocks: [
        { type: "h", text: "Before → After: a full one-page resume" },
        { type: "figure", figure: { kind: "resume",
          before: {
            name: "David Chen", photo: true,
            contact: "+86 138 0013 8000 · Shenzhen, China, Nanshan District · davidchen_88@email.com",
            extra: "DOB: 14.03.1991 · Married, 1 child · Nationality: Chinese",
            roles: [
              { title: "Senior Engineer, Grade A", company: "ICBC", dates: "12.2018-04.2023",
                bullets: ["Responsible for the development and support of backend services", "Participated in various projects using different technologies"] },
              { title: "Programmer", company: "Tencent Ltd.", dates: "06.2015-11.2018",
                bullets: ["Was engaged in the frontend part of the applications", "Worked in a team on different tasks"] },
            ],
            skills: "Java, Spring, JavaScript, React, SQL, Git, Docker, Kubernetes, AWS, Agile, Scrum, Linux, Jenkins, REST, …",
            verdict: "Scrambled by the parser · set aside in six seconds" },
          after: {
            name: "David Chen", photo: false,
            contact: "+1 (647) 555-0192 · Toronto, ON · david.chen@email.com · linkedin.com/in/davidchen",
            extra: "Eligible to work in Canada (PR)",
            roles: [
              { title: "Senior Backend Engineer / Tech Lead", company: "ICBC (China’s largest bank - think RBC-scale, 100M+ customers)", dates: "Dec 2018 - Apr 2023",
                bullets: ["Scaled the payments service to 8k req/s at p99 <120ms, cutting failed transactions 3.1% → 0.7% (Java/Spring, PostgreSQL)", "Led a 6-engineer team rebuilding the billing platform, shipping a ~$3M CAD migration 6 weeks early"] },
              { title: "Software Engineer", company: "Tencent (global tech firm, 100k+ staff)", dates: "Jun 2015 - Nov 2018",
                bullets: ["Rebuilt the checkout flow in React/TypeScript, cutting first-load 2.4s → 0.9s and lifting conversion +12%", "Owned a component library used across 4 product teams"] },
            ],
            skills: "Java · Spring · PostgreSQL · React · TypeScript · AWS · Docker · Kubernetes",
            verdict: "Parser-clean · a number in every line · a reason to call" },
        },
          caption: "Same career, same person - toggled from ‘foreign’ to ‘legible.’ Use it as the template for your own teardown." },
      ],
    },
  },

/* ═══════════════════════ MODULES 03-06 - full content ═══════════════════════ */
  {
    id: "module-3",
    n: "03",
    of: "06",
    track: "Get referred",
    locked: false,
    title: "Reach people, not the void",
    subtitle: "Most roles here fill through a name, not a posting. This is how you get introduced when your Canadian network is, today, exactly zero people - using scripts that don’t make you cringe and don’t make you lie.",
    meta: [
      "~32 min read",
      "1 outreach engine + 15 ready scripts",
      "turns Module 2’s legible resume into a referred read"
    ],
    build: "You don’t leave with ‘network more.’ You leave with a **filled Warm-Map and a 20-message outreach week** - named targets, the exact copy-paste scripts for each, and the follow-up cadence - so by Friday real people have your resume in hand.",
    teaserNext: {
      id: "module-4",
      line: "Next - the warm intro gets you the interview. Module 4 gets you through it: the behavioral round Canadian teams weight hardest, decoded."
    },
    sections: [
      {
        n: "01",
        eyebrow: "Clear the noise",
        title: "Four reasons you’re not reaching out - and why each one is a trap",
        lead: "Module 1 showed warm beats cold by an order of magnitude. You know that. You still haven’t sent the messages. Let’s name why - and grant each excuse its grain of truth before we take it apart.",
        blocks: [
          {
            type: "p",
            text: "Networking is the highest-leverage thing on your whole job hunt and the thing newcomers avoid hardest. Not from laziness - from four very reasonable-sounding stories. Here they are, with the truth inside each."
          },
          {
            type: "lies",
            items: [
              {
                claim: "I don’t know a single person here - I have nothing to network *from*.",
                grain: "True today. You did just arrive.",
                trap: "But a referral network isn’t people you know - it’s people you can *reach.* Strangers refer strangers here constantly; that’s what the coffee-chat culture exists to do. You start at zero contacts, not zero reach."
              },
              {
                claim: "Reaching out to strangers is rude - I’d be imposing.",
                grain: "Where you’re from, an unsolicited message to a senior person may genuinely be a faux pas.",
                trap: "Here it’s the opposite: a specific, warm, low-ask message is normal, expected, and often flattering. Right instinct, wrong country. The etiquette is different and learnable."
              },
              {
                claim: "Recruiters won’t touch a newcomer with no Canadian experience.",
                grain: "Some agency recruiters do chase only easy placements.",
                trap: "But recruiters are paid *only* when they place someone - they’re structurally on your side, and a good one will market your foreign experience for you. You just have to reach the right ones the right way."
              },
              {
                claim: "If my application can’t get a reply, why would a DM?",
                grain: "Both can be ignored, sure.",
                trap: "An application lands in a stack of 250 read by a tired stranger. A good DM lands in an inbox of 4, addressed to a person, referencing their actual work. Completely different odds - that’s the entire point of this module."
              }
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "spark",
            text: "Here’s the reframe for the whole module: **a referral is not a favour you beg for - it’s a low-risk bet someone makes because you made it easy and safe to make.** Most companies pay employees a referral bonus precisely to get names like yours. You’re not asking for charity. You’re handing someone a small win. Build everything below on that footing and the cringe disappears."
          },
          {
            type: "figure",
            figure: {
              kind: "locusFlip",
              external: [
                "Not knowing anyone yet",
                "‘Networking feels rude’",
                "Recruiters who ghost",
                "Your application got ignored"
              ],
              controllable: [
                "How many people you reach each week",
                "Sending a specific, low-ask message",
                "Reaching the recruiters who place *your* stack",
                "Making the ask easy and safe to say yes to"
              ],
              leftLabel: "The story stopping you",
              rightLabel: "What you actually control"
            },
            caption: "Every story on the left is real - and every one of them has a lever on the right you haven’t pulled yet."
          }
        ],
        oneLiner: "A referral network isn’t who you know. It’s who you can reach - and that number is yours to set."
      },
      {
        n: "02",
        eyebrow: "The machine",
        title: "How a role really gets filled - and where the warm door is",
        lead: "Module 1 ranked your channels by odds. Now look at the same thing from the *company’s* side, because once you see how a req actually fills, you’ll see exactly where to stand.",
        blocks: [
          {
            type: "p",
            text: "A manager gets headcount approved. What happens next almost never starts with a public posting - and that gap is the entire hidden job market newcomers can’t see."
          },
          {
            type: "ul",
            items: [
              {
                lead: "First, they ask the team.",
                text: "“Anyone know someone good?” A referral that lands here can get interviewed before the job is ever posted publicly. Zero competition, maximum trust."
              },
              {
                lead: "Then internal recruiting sources it.",
                text: "An internal recruiter mines LinkedIn and their existing pipeline. This is why your localized Module-2 LinkedIn matters - it’s the surface they search before you’ve applied anywhere."
              },
              {
                lead: "Often, agencies get the req too.",
                text: "Staffing and recruitment firms are handed the role to fill on commission. For a newcomer with no network, this is a genuine fast-lane - someone whose literal job is to market you."
              },
              {
                lead: "Only then does it hit the job boards.",
                text: "By the time you see the posting and join the 250-person cold stack, warm candidates may already be in the pipeline. You’re not early. You’re last in line - through the worst door."
              }
            ]
          },
          {
            type: "callout",
            tone: "quote",
            icon: "quote",
            text: "Here’s a real Slack exchange from my side. Me to the team: “opening a backend req, anyone got someone before I post it?” An engineer: “yeah my old coworker just moved to Toronto, want me to intro?” Me: “send them my way.” That candidate skipped the queue, the ATS, and the six-second scan - all of it - because they’d had a fifteen-minute coffee chat with my engineer three weeks earlier. The posting went up a week later for show. The job was effectively gone."
          },
          {
            type: "p",
            text: "Read that again: the role was filled by a *coworker’s coffee chat from three weeks before there was even a job.* The warm door isn’t a trick you run on an open posting. It’s a position you take *before* the posting exists - so when the Slack message goes out, your name is the one someone types."
          },
          {
            type: "figure",
            figure: {
              kind: "threeGates",
              gates: [
                {
                  name: "Ask the team",
                  icon: "user",
                  symptom: "Referral interviewed before the job is even posted",
                  fixedIn: "§3 referral ask"
                },
                {
                  name: "Internal + agency",
                  icon: "globe",
                  symptom: "Recruiters source from LinkedIn & their pipeline",
                  fixedIn: "§5 recruiters"
                },
                {
                  name: "Public job board",
                  icon: "doc",
                  symptom: "You + 250 strangers, six-second scan",
                  fixedIn: "the cold pile"
                }
              ]
            },
            caption: "Roles fill left-to-right and leak out before they reach the board. Cold applying means fighting for whatever’s left at the last gate. (Stage order is how I’ve seen reqs run; timing varies by company.)"
          }
        ],
        oneLiner: "By the time a job is posted, the warm candidates are already inside. Get there before the posting."
      },
      {
        n: "03",
        eyebrow: "The core move",
        title: "The coffee chat - the engine that makes every referral possible",
        lead: "Everything in this module runs on one primitive: the 15-minute coffee chat. Master this one move and recruiters, referrals, and hiring-manager replies all become downstream of it. Get it wrong and every script below falls flat.",
        blocks: [
          {
            type: "p",
            text: "A ‘coffee chat’ (almost always a 15-minute video call now) is a culturally normal Canadian ritual where you ask someone about *their* experience - their path, their team, their advice. That’s it. You are explicitly **not** asking for a job. And that’s exactly why it works: you remove the pressure, so a stranger can say yes cheaply - and a warm relationship is the soil a referral grows in later."
          },
          {
            type: "h",
            text: "The one rule that kills the cringe: ask for advice, not a job"
          },
          {
            type: "p",
            text: "The instinct that makes outreach feel gross is the hidden ask - messaging someone while everyone knows you actually want their job. So make the small ask the *real* ask. Be genuinely curious about their work. The referral, if it comes, comes later and unprompted - because people refer people they’ve had a good conversation with, not people who pitched them in line one."
          },
          {
            type: "figure",
            figure: {
              kind: "weeklyLoop",
              steps: [
                {
                  label: "Pick a relevant person",
                  icon: "target"
                },
                {
                  label: "Specific, low-ask DM",
                  icon: "chat"
                },
                {
                  label: "15-min chat about THEM",
                  icon: "user"
                },
                {
                  label: "Send thanks + your value",
                  icon: "check"
                },
                {
                  label: "Stay on their radar",
                  icon: "spark"
                }
              ]
            },
            caption: "The coffee-chat loop. Nothing here asks for a job - and that’s precisely why it ends in referrals. Run it, don’t rush it."
          },
          {
            type: "h",
            text: "Script 1 - the coffee-chat ask (copy, paste, change the bold parts)"
          },
          {
            type: "callout",
            tone: "quote",
            icon: "chat",
            text: "Hi Sarah - I’m a backend engineer who recently moved to Toronto from Shenzhen, and I came across your work on **Shopify’s payments team**. I’m trying to understand how engineering teams here operate versus what I’m used to. Would you be open to a quick 15-minute call sometime in the next couple weeks? I’d love to hear about your path - I’m not job-hunting *at* you, just genuinely trying to learn the landscape. Totally understand if you’re swamped."
          },
          {
            type: "ul",
            items: [
              {
                lead: "Why it lands:",
                text: "It’s specific (her actual team, not ‘I saw your profile’), it names the time box (15 minutes - cheap to grant), it states the *real* low ask (advice), and it pre-forgives a no. Every clause is removing a reason to ignore you."
              },
              {
                lead: "The ‘not job-hunting at you’ line is load-bearing.",
                text: "It’s the sentence that dissolves the suspicion. Keep it - and mean it. If you secretly just want a referral on this call, they’ll feel it."
              }
            ]
          },
          {
            type: "callout",
            tone: "warning",
            icon: "close",
            text: "What gets you ignored, every time: a connection request with no note; ‘Can I pick your brain?’ with no specifics; a wall-of-text life story; or the tell-tale newcomer move of attaching your resume to a first message to a stranger. The resume comes *after* the conversation, and only if invited. Lead with the resume and you’ve turned a coffee chat into a cold application."
          }
        ],
        oneLiner: "Ask for a job and you get a no. Ask about their work and you get a relationship - which is where jobs actually come from."
      },
      {
        n: "04",
        eyebrow: "The deep-dive",
        title: "Running the chat, then turning it into a referral",
        lead: "The yes is the easy part. Most newcomers get the call and then waste it - either pitching too hard or being so passive nothing comes of it. Here’s the structure that ends in a referral without ever begging for one.",
        blocks: [
          {
            type: "h",
            text: "The 15 minutes, structured"
          },
          {
            type: "ul",
            items: [
              {
                lead: "Minutes 0-2 - warm and frame.",
                text: "Thank them, restate the 15-min box (they’ll relax when they see you’ll honour it), and say plainly: ‘I really just want to learn how things work here.’"
              },
              {
                lead: "Minutes 2-11 - ask about THEM.",
                text: "‘How did you get into your team?’ ‘What surprised you most about engineering culture here versus elsewhere?’ ‘If you were me, six months in, where would you focus?’ Let them talk. You’re building rapport, not interviewing for a slot."
              },
              {
                lead: "Minutes 11-14 - earn the next step.",
                text: "Now, and only now: ‘This was incredibly helpful. Is there anyone else you’d suggest I talk to?’ That single question is how one chat becomes five. It’s a referral - of a *person*, which is far easier to grant than a referral to a job."
              },
              {
                lead: "Minute 14-15 - close clean.",
                text: "Thank them, honour the clock, offer something back if you can (‘happy to share that Postgres write-up I mentioned’). Then leave. Ending early earns you a reputation as someone worth a second conversation."
              }
            ]
          },
          {
            type: "h",
            text: "The move that makes this a *referral* engine, not just nice chats"
          },
          {
            type: "p",
            text: "After the call, you follow up - and this follow-up is where the referral is actually born. You’ve now shown them you’re normal, prepared, and easy. *That’s* when your legible Module-2 resume can surface, because now it confirms an impression they already have rather than cold-pitching them."
          },
          {
            type: "callout",
            tone: "quote",
            icon: "doc",
            text: "Script 2 - the thank-you that plants the seed: “Thanks so much, Sarah - the bit about how your team scopes projects was exactly the gap in my understanding. You mentioned the team’s growing; on the off chance it’s ever useful, I’ve attached my one-page resume - scaled a payments service to 8k req/s back home, which felt relevant to what you described. No pressure at all, and thank you again for the time.” That’s the entire referral ask. Notice it’s buried in gratitude, tied to *her* words, and pre-forgiven."
          },
          {
            type: "h",
            text: "Script 3 - the direct referral ask (once there’s an open role and rapport exists)"
          },
          {
            type: "callout",
            tone: "quote",
            icon: "user",
            text: "“Hi Sarah - I saw **Shopify** posted a **Senior Backend Engineer** role on the payments side, which lines up almost exactly with what we talked about. Would you feel comfortable referring me, or pointing me to the right person? I’ve attached my resume and a 3-line summary you can paste straight into the referral form so it’s zero work for you. Completely understand if you’d rather not - no hard feelings either way.” "
          },
          {
            type: "callout",
            tone: "insight",
            icon: "spark",
            text: "The novel asset in this whole module - **the Referral Kit.** When you ask anyone to refer you, attach a tiny pre-written block: (1) your one-line pitch, (2) the exact role + link, (3) three resume bullets they can paste, (4) a one-sentence ‘why me for this.’ You’ve just made referring you a 10-second copy-paste instead of a chore. I have *never* seen a newcomer do this, and it roughly doubles yes-rates in my experience - because the #1 reason people don’t refer isn’t doubt, it’s effort. Remove the effort and the yes is easy. Build this kit once; reuse it forever."
          }
        ],
        oneLiner: "Don’t ask people to do work to help you. Do the work for them, and the help becomes effortless to give."
      },
      {
        n: "05",
        eyebrow: "The fast-lane",
        title: "Recruiters & staffing firms - the newcomer’s shortcut",
        lead: "When you know nobody, the fastest warm channel isn’t a friend - it’s a professional whose literal income depends on placing you. Most newcomers either ignore recruiters or annoy them. Here’s how to make them work for you.",
        blocks: [
          {
            type: "p",
            text: "Two species, and the difference matters. **Internal recruiters** work for one company and fill its roles. **Agency / staffing recruiters** work for a firm that gets paid a commission when they place you anywhere - so a good one will actively shop your profile around. For a newcomer with no network, the agency recruiter is the single most underused fast-lane in the country."
          },
          {
            type: "figure",
            figure: {
              kind: "channelBars",
              bars: [
                {
                  label: "Cold-applying to agency postings",
                  value: 22,
                  tone: "cold",
                  note: "you’re still in a stack"
                },
                {
                  label: "Generic ‘pls find me a job’ DM",
                  value: 30,
                  tone: "cold",
                  note: "no role to match you to"
                },
                {
                  label: "Specific, role-matched recruiter DM",
                  value: 66,
                  tone: "warm",
                  note: "you make their job easy"
                },
                {
                  label: "Replying fast to recruiter inbound",
                  value: 88,
                  tone: "hot",
                  note: "they already want you"
                }
              ]
            },
            caption: "How you engage a recruiter swings the odds enormously. Warmest of all is simply being *findable and fast* - which your Module-2 LinkedIn already set up. (Relative odds, my calibration - not measured percentages.)"
          },
          {
            type: "h",
            text: "Finding the right ones (not all recruiters are for you)"
          },
          {
            type: "ul",
            items: [
              {
                lead: "Search LinkedIn for your niche.",
                text: "‘technical recruiter’ + your city + your stack (e.g. ‘backend recruiter Toronto’). A recruiter who places .NET roles can’t help a data scientist - match the specialism."
              },
              {
                lead: "Name the big tech staffing firms.",
                text: "In Canada that includes the likes of Robert Half, Hays, Randstad, TEKsystems, Procom and Lannick, plus boutique tech shops. Connect with consultants who post *your* kind of role."
              },
              {
                lead: "Engage the ones already messaging you.",
                text: "If a recruiter inbounds you (your localized LinkedIn working as designed), reply within hours, not days. Speed is itself a signal that you’re easy to place."
              }
            ]
          },
          {
            type: "h",
            text: "Script 4 - the recruiter reply that gets you actively marketed"
          },
          {
            type: "callout",
            tone: "quote",
            icon: "chat",
            text: "“Hi James - thanks for reaching out, the **fintech backend role** sounds like a strong fit. Quick snapshot: senior backend engineer, 7 years, **Java/Spring + PostgreSQL**, recently relocated to Toronto and **authorized to work in Canada (PR)**. Most relevant: I scaled a payments platform to 8k req/s at a 20M-customer bank. I’m targeting **$130-150k** and open to hybrid downtown. Resume attached - happy to hop on a quick call. What roles are you working on right now?” "
          },
          {
            type: "ul",
            items: [
              {
                lead: "Why it works:",
                text: "You handed him everything he needs to pitch you in 20 seconds - level, stack, work authorization, a headline win, comp range, location. You’ve made yourself the easiest candidate in his inbox to place."
              },
              {
                lead: "Always state work authorization.",
                text: "It’s a recruiter’s very first filter and their biggest fear with a newcomer. Answering it unasked (‘authorized to work, PR’) removes the one thing that makes them hesitate to invest in you."
              },
              {
                lead: "Give a comp range, not a refusal.",
                text: "‘I’m flexible’ wastes their time; a range lets them match you to reqs immediately. Module 6 makes that number real - for now, a researched range beats silence."
              }
            ]
          },
          {
            type: "callout",
            tone: "warning",
            icon: "bolt",
            text: "Recruiter etiquette that protects you: never let two recruiters submit you to the *same* company - double-submission can get your application thrown out entirely, and it makes you look careless. Ask each recruiter to confirm before they submit you anywhere, and keep a one-line log of who sent you where. A staffing firm is a tool, not your only strategy - run them in parallel with your own warm outreach."
          }
        ],
        oneLiner: "A recruiter is the one stranger who gets paid to fight for you. Make yourself the easiest bet in their inbox."
      },
      {
        n: "06",
        eyebrow: "The bypass",
        title: "Cold outreach to the hiring manager that actually gets replies",
        lead: "Sometimes there’s no mutual contact and no recruiter - just a role you want and the person who owns it. Done right, a direct message to the hiring manager skips the queue entirely. Done the usual way, it joins the spam. The gap between the two is craft.",
        blocks: [
          {
            type: "p",
            text: "Reframe Module 1’s ‘direct-to-manager’ channel from theory into a message. The hiring manager is the person whose team the role is on - usually an engineering manager or team lead, findable on the posting, LinkedIn, or the company’s team page. A cold message that respects their time can land you a conversation the ATS would never have allowed."
          },
          {
            type: "h",
            text: "The anatomy of a hiring-manager message that gets a reply"
          },
          {
            type: "ul",
            items: [
              {
                lead: "A specific, human hook.",
                text: "Reference their actual work, team, or a talk they gave - proof you’re not blasting 50 identical messages."
              },
              {
                lead: "One line of relevant proof.",
                text: "The single most relevant thing you’ve done for *their* problem. Not your life story - one sharp, quantified line from your resume."
              },
              {
                lead: "A tiny, clear ask.",
                text: "Not ‘give me a job.’ Ask for a 15-minute chat, or simply whether they’re the right person to talk to about the role."
              },
              {
                lead: "Brevity as respect.",
                text: "Under 120 words. A manager skims on a phone between meetings. Long = unread."
              }
            ]
          },
          {
            type: "figure",
            figure: {
              kind: "impactFormula",
              parts: [
                {
                  label: "Specific hook",
                  hint: "their actual work"
                },
                {
                  label: "One proof line",
                  hint: "your most relevant win",
                  accent: true
                },
                {
                  label: "Tiny ask",
                  hint: "15 min, not a job"
                },
                {
                  label: "Under 120 words",
                  hint: "respect their time"
                }
              ]
            },
            caption: "The four parts of a cold message that gets opened *and* answered. Drop any one and the reply rate falls off a cliff."
          },
          {
            type: "h",
            text: "Script 5 - the hiring-manager cold message"
          },
          {
            type: "callout",
            tone: "quote",
            icon: "user",
            text: "“Hi Priya - I saw you lead the **platform team at Wealthsimple** and that you’re hiring a senior backend engineer. I won’t bury you in a pitch: I spent the last 4 years scaling a payments system to **8k req/s at a 20M-customer bank**, which looks close to the scale you’re working at. Are you the right person to talk to about the role, or could you point me to them? Happy to send a resume if useful. Either way, I admire what your team shipped with the new ledger system.” "
          },
          {
            type: "callout",
            tone: "insight",
            icon: "target",
            text: "Where to send it: LinkedIn is fine, but a direct email often beats the algorithm. Canadian corporate emails are usually a guessable pattern (firstname.lastname@company.com); a free tool like Hunter can confirm it. And the highest-converting variant of all - the **mutual-contact bridge**: if a past coffee chat knows this manager, your message in §4’s Script 3 (‘could you intro me?’) beats any cold message ever will. Cold is the fallback; warm-by-one-degree is the goal."
          },
          {
            type: "callout",
            tone: "warning",
            icon: "close",
            text: "Don’t: message the CEO of a 2,000-person company for an IC role (wrong person, reads as naive), send the identical message to eight people at one company (they talk), or follow up four times in a week (once, after 5-7 days, then stop). One thoughtful message to the right person beats ten to the wrong ones."
          }
        ],
        oneLiner: "A cold message isn’t spam because it’s uninvited. It’s spam because it’s lazy. Specific and short is neither."
      },
      {
        n: "07",
        eyebrow: "Decode the phrase",
        title: "What ‘let’s stay in touch’ and the other soft no’s really mean",
        lead: "Networking runs on polite Canadian phrases that sound warmer than they are - and newcomers either over-read them into false hope or under-read them and burn a real lead. Here’s the honest translation, and what to *do* with each.",
        blocks: [
          {
            type: "decode",
            items: [
              {
                worry: "“Let’s stay in touch / keep me posted.”",
                signal: "Genuine but passive - it means ‘I like you, but I won’t chase this.’ The ball is yours. Do something with it: a short, specific update in 3-4 weeks (‘started that course you mentioned’) keeps you on their radar without nagging."
              },
              {
                worry: "“We don’t have anything right now, but…”",
                signal: "Often true *and* an open door. Reply: ‘Totally understand - would it be alright if I checked back in a couple months?’ Then actually do it. Many referrals come from the *second* touch, when a req has opened."
              },
              {
                worry: "“You should connect with [name].”",
                signal: "This is gold, not a brush-off - it’s a referral of a person. Ask for a warm intro on the spot: ‘Would you mind introducing us?’ A forwarded intro converts ten times better than you cold-messaging that name yourself."
              },
              {
                worry: "“Have you applied through our careers page?”",
                signal: "Not always a dismissal - sometimes it means ‘apply and I’ll flag you internally.’ Ask the follow-up: ‘Will do - would you be open to referring me once I have, so it doesn’t vanish into the system?’ That converts a deflection into a referral."
              },
              {
                worry: "Silence after a good first message.",
                signal: "Usually just a busy inbox, not a no. One brief, friendly follow-up after 5-7 days (‘floating this back up in case it slipped by’) is normal and expected here - it is not rude. Two follow-ups is. Send one, then move on."
              }
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "chat",
            text: "The meta-skill: **Canadian niceness is real warmth, but it is not commitment.** A friendly reply means you didn’t offend and the door’s ajar - not that anything will happen on its own. Treat every warm soft-no as ‘yours to follow up,’ and you’ll harvest referrals that the people who took the words literally walked away from."
          }
        ],
        oneLiner: "‘Let’s stay in touch’ is an invitation, not a closing. The follow-up is where the referral actually lives."
      },
      {
        n: "08",
        eyebrow: "Run it like an engineer",
        title: "The weekly outreach loop - and protecting your dignity while you run it",
        lead: "Same operating system as Modules 1 and 2, pointed at people instead of postings. Outreach is a numbers game with a human face, so you instrument the numbers and protect the human - yours.",
        blocks: [
          {
            type: "p",
            text: "Score the only inputs you control: **messages sent, chats booked, referrals asked.** Not ‘did they reply’ - that’s the output, and outputs lag. A week of 20 thoughtful messages and zero replies is a *won* week, because you ran the only play that compounds. Replies arrive on their schedule; you just have to keep the pipeline full."
          },
          {
            type: "figure",
            figure: {
              kind: "weeklyLoop",
              steps: [
                {
                  label: "Add 10 names to Warm-Map",
                  icon: "map"
                },
                {
                  label: "Send 15-20 messages",
                  icon: "chat"
                },
                {
                  label: "Run booked chats",
                  icon: "user"
                },
                {
                  label: "Log replies & asks",
                  icon: "doc"
                },
                {
                  label: "Follow up the warm soft-no’s",
                  icon: "spark"
                }
              ]
            },
            caption: "The networking loop. The follow-up step is the one everyone skips - and it’s where most referrals are actually won."
          },
          {
            type: "callout",
            tone: "insight",
            icon: "bolt",
            text: "Carry forward Module 1’s Input Score, retuned for people: **(messages + chats + referral asks) hit ÷ targets set.** My starting calibration - 15-20 outreach messages, 2-3 booked chats, 1-2 referral asks a week - is a sustainable pace that fills a pipeline without burning you out. Tune the numbers to your energy; keep the cadence. A hit-your-inputs week with no replies still beats a refresh-LinkedIn-all-day week, every time."
          },
          {
            type: "h",
            text: "The math that should reshape your week"
          },
          {
            type: "p",
            text: "Say 1 in 4 messages earns a chat, and 1 in 4 chats eventually yields a referral or strong lead - *my rough calibration, not a measurement; track your own.* That’s 16 messages for one referral. Sounds like a lot until you remember a single referral can be worth more than 100 cold applications. Suddenly 20 messages a week isn’t a grind - it’s the highest-paid hour on your calendar."
          },
          {
            type: "callout",
            tone: "warning",
            icon: "user",
            text: "The dignity guardrail, because this is the part that quietly wrecks people: you *will* get ignored, a lot, and it is not a verdict on your worth. Senior people miss messages constantly. Decouple your self-image from your reply rate - score the send, never the silence - and keep your search to focused blocks so being ignored 15 times on Tuesday doesn’t bleed into your whole week. A grounded person writes better messages and interviews better. Protecting your morale is strategy, not softness."
          }
        ],
        oneLiner: "Score the send, not the silence. The pipeline you keep full this week pays out three weeks from now."
      },
      {
        n: "09",
        eyebrow: "The long game",
        title: "Edge cases, etiquette, and the line you never cross",
        lead: "The questions you’re actually worried about - the awkward, specific ones a generic ‘just network!’ guide skips, and the ones that quietly cost trust when nobody warns you.",
        blocks: [
          {
            type: "decode",
            items: [
              {
                worry: "My spoken English makes me dread a live call.",
                signal: "Two real options. One: do early chats over text/async first to build confidence, then graduate to calls. Two: lean on written outreach where your Module-2 register already shines. And know that a clear, structured non-native speaker reads as competent here - fluency theatre isn’t the bar. Module 4 trains the spoken muscle directly."
              },
              {
                worry: "Is it weird to network with people from my own home community?",
                signal: "The opposite - it’s the single warmest channel you have. Diaspora and alumni networks (your university’s Canada chapter, ‘[your country]s in Tech Toronto’ groups) are full of people who were where you are two years ago and *want* to help. Start there; it’s the lowest-cringe outreach that exists."
              },
              {
                worry: "Someone referred me and I got rejected. Did I burn them?",
                signal: "No - referrers expect a normal hit rate. Close the loop with a gracious thank-you regardless of outcome (‘didn’t work out, but I really appreciate you putting me forward’). Handling a rejection well makes them *more* likely to refer you again, not less."
              },
              {
                worry: "What do I actually give back? I’m the one with nothing.",
                signal: "You have more than you think: share a relevant article, make an intro between two people you’ve met, offer a perspective from your home market, or just be genuinely easy and grateful. Networking is reciprocal over time - bank goodwill now and it compounds."
              }
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "check",
            text: "The honesty line - same as Module 2, and it matters more here because referrals are someone staking their reputation on you. Never claim a mutual contact you don’t have. Never imply someone referred you when they only had a chat with you. Never fabricate a shared connection to warm up a cold message. A referral is borrowed trust; spend it dishonestly once and you lose the lender forever. Everything in this module works *without* a single lie - that’s the whole design."
          },
          {
            type: "h",
            text: "Common mistakes that quietly cost you referrals"
          },
          {
            type: "ul",
            items: [
              "Treating networking as something you do only when unemployed - the people who do it always have a pipeline you’ll never have.",
              "Going straight for the job in message one, so the chat never happens and the referral never has soil to grow in.",
              "Never following up - letting every warm ‘stay in touch’ die from neglect, which is where most lost referrals go.",
              "Making the referrer do the work - no role link, no pasteable bullets - instead of handing them the Referral Kit.",
              "Only networking ‘up’ at senior people. Peers and recent-hires are more responsive, refer just as effectively, and were recently in your exact shoes.",
              "Burning a recruiter relationship by ghosting them once a better lead appears. Close every loop; the market is smaller than it looks."
            ]
          }
        ],
        oneLiner: "A referral is borrowed trust. Spend it honestly and it compounds; spend it once dishonestly and the account closes."
      }
    ],
    assignment: {
      title: "Your Week-3 outreach engine",
      intro: "You don’t finish this week with the idea of networking. You finish it holding a filled Warm-Map, a reusable Referral Kit, and 15-20 messages actually sent - real people now hold your resume. Build the artifacts first, then run the loop.",
      steps: [
        {
          lead: "Build your Warm-Map (20 names).",
          text: "Fill the table below with 20 reachable people across four lanes - diaspora/alumni, recruiters, potential coffee chats, and hiring managers of open roles. You start at zero contacts, not zero reachable people; prove it to yourself by filling all 20 rows."
        },
        {
          lead: "Assemble your Referral Kit once.",
          text: "Write the four reusable blocks - one-line pitch, three pasteable resume bullets, your work-authorization line, and a comp range. You’ll attach this to every referral and recruiter message for the rest of your search. Build it once; reuse it forever."
        },
        {
          lead: "Send the scripts.",
          text: "Adapt Scripts 1-5 to your real targets and send 15-20 this week: coffee-chat asks, recruiter replies, and 2-3 hiring-manager messages. Personalize the bold parts - never blast the template raw."
        },
        {
          lead: "Score the inputs, not the outcomes.",
          text: "Log messages sent, chats booked, referral asks made. Compute your Input Score (hit ÷ target). Then book next week’s follow-ups for every warm soft-no - that step is where the referrals actually land."
        }
      ],
      blocks: [
        {
          type: "h",
          text: "Your Warm-Map - a worked example (fill your own 20 rows)"
        },
        {
          type: "table",
          note: "Four lanes, because a real pipeline isn’t all one channel. Notice the warmest rows (diaspora, a recruiter who inbounded you) cost the least and convert the most - start there, then work outward to the colder, higher-effort rows.",
          cols: [
            "Name / how found",
            "Lane",
            "Script to use",
            "Status",
            "Next touch"
          ],
          rows: [
            [
              "L. Zhang - ‘Newcomers in Tech TO’",
              "Diaspora/alumni",
              "1 - coffee-chat ask",
              "Chat booked Thu",
              "Send Referral Kit after"
            ],
            [
              "James H. - recruiter, inbounded me",
              "Recruiter",
              "4 - recruiter reply",
              "Replied, sent snapshot",
              "Call Wed, log roles"
            ],
            [
              "Sarah L. - Shopify payments, LinkedIn",
              "Coffee chat",
              "1 → 2 → 3",
              "Message sent",
              "Follow up in 5 days"
            ],
            [
              "Priya R. - EM, Wealthsimple open req",
              "Hiring manager",
              "5 - cold message",
              "Sent via email",
              "One follow-up day 7"
            ],
            [
              "D. Okoye - alum, 1 year ahead of me",
              "Diaspora/alumni",
              "1 - coffee-chat ask",
              "Said ‘connect with…’",
              "Ask for warm intro"
            ]
          ]
        },
        {
          type: "h",
          text: "Your Referral Kit - a worked example (write your own)"
        },
        {
          type: "table",
          note: "Paste-ready blocks so referring you is a 10-second copy job, not a chore. This is the single highest-leverage artifact in the module - the thing that roughly doubles your yes-rate. Build it once.",
          cols: [
            "Block",
            "Your filled-in version"
          ],
          rows: [
            [
              "One-line pitch",
              "Senior backend engineer, 7 yrs, Java/Spring + PostgreSQL - scaled payments to 8k req/s at a 20M-customer bank, now in Toronto."
            ],
            [
              "Role + link",
              "Senior Backend Engineer, Payments - [exact posting URL]"
            ],
            [
              "3 pasteable bullets",
              "• 8k req/s at p99 <120ms  • led a 6-eng team, $3M migration shipped 6 wks early  • cut failed transactions 3.1% → 0.7%"
            ],
            [
              "Work authorization",
              "Eligible to work in Canada (PR) - no sponsorship needed."
            ],
            [
              "Comp range",
              "Targeting $130-150k CAD, hybrid or remote, Toronto."
            ]
          ]
        },
        {
          type: "h",
          text: "Score sheet - a worked example (track your own weekly)"
        },
        {
          type: "table",
          note: "Directional starting targets - my calibration, tune to your own energy after a week. The point isn’t the exact numbers; it’s that you score the send, never the silence.",
          cols: [
            "Input",
            "Target",
            "Hit",
            "Score"
          ],
          rows: [
            [
              "Outreach messages sent",
              "15-20",
              "18",
              "✓"
            ],
            [
              "Coffee chats booked",
              "2-3",
              "2",
              "✓"
            ],
            [
              "Referral asks made",
              "1-2",
              "1",
              "✓"
            ],
            [
              "Warm soft-no’s followed up",
              "all of them",
              "3 of 3",
              "✓"
            ]
          ]
        }
      ]
    }
  },

  {
    id: "module-4",
    n: "04",
    of: "06",
    track: "Win the room",
    locked: false,
    title: "Interview the Canadian way",
    subtitle: "You cleared the screen - congratulations, that was the hard part. Now you walk into a room where the questions are about *people*, not algorithms, and the rules are unwritten. Here’s the rulebook nobody handed you: what “great teammate” actually sounds like out loud, in Canadian English.",
    meta: [
      "~32 min read",
      "5 STAR stories + a disagreement script you’ll rehearse",
      "the round that’s decided on *how* you answer, not *whether* you can"
    ],
    build: "You’ll leave with your **Story Bank** - five STAR answers written to the five themes Canadian teams actually test, plus a rehearsed-aloud script for the one question that sinks more newcomers than any system-design problem: *“Tell me about a time you disagreed.”*",
    teaserNext: {
      id: "module-5",
      line: "Next - the behavioral round rewards a great teammate; Module 5 makes sure the *technical* round can’t be the thing that says no. Just the patterns local loops actually test."
    },
    sections: [
      {
        n: "01",
        eyebrow: "Clear the noise",
        title: "Four things that are true about the behavioral round - and still sink you",
        lead: "Module 2 cleared comforting lies about your resume. This round has its own four, and like before, the dangerous ones aren’t false. They’re *true* - and being right about them is exactly what walks you into the trap.",
        blocks: [
          {
            type: "p",
            text: "You got the interview. Real proof the resume worked, the channel worked, you’re past the filters. And now a different fear arrives, because this round doesn’t feel like engineering at all. It feels like a test of *you* - your English, your personality, whether they’ll ‘like’ you. Let’s name the four stories your brain reaches for, grant each its grain of truth, then notice where each one quietly aims you wrong."
          },
          {
            type: "lies",
            items: [
              {
                claim: "This round is just a friendly chat - the real test was technical.",
                grain: "It’s conversational on the surface, and a good interviewer works hard to make it feel relaxed.",
                trap: "At most Canadian teams the behavioral round carries as much weight as the coding one, sometimes more for mid-and-senior roles. ‘Friendly chat’ is the format. ‘Can we work with this person for three years’ is the question. People who treat it as small talk lose to people who prepared."
              },
              {
                claim: "My English will give me away, so I’ve already lost.",
                grain: "Spoken fluency is genuinely assessed here, and pretending otherwise would be dishonest - we handle it head-on in section 7.",
                trap: "But they’re scoring *clarity*, not *accent*. A clear, structured answer in accented English beats a flawless-accent ramble every time. The thing you can fix this week - structure - matters more than the thing you can’t."
              },
              {
                claim: "I should show how strong and decisive I am.",
                grain: "Confidence is good, and false modesty reads as weakness.",
                trap: "The story that wins here is rarely ‘I was right and pushed it through.’ It’s ‘I disagreed, I listened, we found a better answer together.’ Optimize for *lone hero* and you’ll fail the exact trait this round exists to measure."
              },
              {
                claim: "If I just answer honestly and be myself, that should be enough.",
                grain: "Authenticity matters and interviewers smell a rehearsed-robot from across the table.",
                trap: "‘Be yourself’ assumes the room reads your self the way you intend. A newcomer’s honest, direct ‘this approach is wrong’ - completely normal back home - can land here as abrasive. Same self, different room. You don’t need a new personality. You need to know how this room hears the one you have."
              }
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "spark",
            text: "Here’s the reframe for the whole module: the behavioral round isn’t testing whether you’re *good*. They already believe you’re good - the resume and screen settled that. It’s testing whether you’re **safe to put on a team**: do you handle conflict without drama, take feedback without bruising, raise problems early, and make the people around you better. ‘Great teammate’ isn’t a vibe. It’s a short list of behaviors you can show on purpose."
          }
        ],
        oneLiner: "They’ve already decided you’re smart. This round decides whether they want you in the room."
      },
      {
        n: "02",
        eyebrow: "The machine",
        title: "What the behavioral round is actually scoring",
        lead: "I’ve sat on the panel for these. Let me show you the scorecard that’s open in the next tab while you talk - because once you see what they’re grading, the whole round stops feeling like a personality test and starts feeling like a spec you can build to.",
        blocks: [
          {
            type: "p",
            text: "After the loop, the interviewers meet - a *debrief* - and each fills a scorecard against a small set of named signals. They’re not writing ‘seemed nice.’ They’re scoring specific, repeating dimensions. Here are the five that show up on nearly every behavioral rubric I’ve used, and what each one is really asking."
          },
          {
            type: "signals",
            items: [
              {
                n: "1",
                name: "Collaboration & conflict",
                what: "How you work *with* people, especially when you disagree. This is the single most-weighted behavioral signal on most Canadian teams - and the one newcomers most often misread.",
                why: "Software is built by teams that argue. They need proof you can disagree about the *work* without it becoming about the *person* - and that you’ll change your mind when shown a better argument.",
                fix: "Have a disagreement story where you genuinely lost - or where the team’s answer beat yours - and you’re glad it did. That story scores higher than any story where you won.",
                before: "“My design was correct, so I convinced them and we did it my way.”",
                after: "“I made my case with data, the senior dev raised a failure mode I’d missed, we went with her approach - and it was the right call.”"
              },
              {
                n: "2",
                name: "Ownership & accountability",
                what: "Whether you take responsibility for outcomes, including failures, without blaming people or circumstances.",
                why: "A teammate who says ‘that wasn’t my fault’ in an interview will say it in a postmortem. They’re screening that out now.",
                fix: "Tell a real failure story where *you* own the miss and land on the concrete process change you made after. ‘What I changed’ is the whole point.",
                before: "“The project failed because the requirements kept changing and QA missed it.”",
                after: "“I shipped without enough test coverage on the edge cases - that was on me. Now I write the test plan before the first line of code.”"
              },
              {
                n: "3",
                name: "Communication & clarity",
                what: "Can you explain a complex thing simply, structure an answer, and be understood - including across a language gap.",
                why: "Half the job is writing docs, explaining tradeoffs, and unblocking teammates. An unclear communicator is a tax on everyone around them.",
                fix: "Structure (STAR, next section) is what they’re really grading here - not accent. A structured answer *sounds* clear even in a second language.",
                before: "A four-minute story with no beginning, three tangents, and no clear result.",
                after: "Situation → Task → Action → Result, ninety seconds, lands the number at the end."
              },
              {
                n: "4",
                name: "Handling ambiguity",
                what: "What you do when the requirements are vague, the spec is missing, or nobody’s told you the ‘right’ answer.",
                why: "Real work is ambiguous. They want someone who asks clarifying questions and proposes a path - not someone who freezes waiting to be told what to do.",
                fix: "Show the loop: clarify → propose a small scope → confirm → build. (We drill this in section 6.)",
                before: "“I waited for the product manager to give me the full spec before starting.”",
                after: "“The spec was thin, so I wrote up three assumptions, proposed the smallest version that would prove the idea, and confirmed before building.”"
              },
              {
                n: "5",
                name: "Growth & coachability",
                what: "Do you seek feedback, act on it, and get better - or do you defend? Especially: how you take a code review.",
                why: "On a healthy team you’ll get your code critiqued daily. Someone who takes a review personally is exhausting and slow to grow.",
                fix: "A story where feedback stung, you took it anyway, and you’re better for it. Bonus: a time you changed your mind because of a junior’s input.",
                before: "“My reviewer was nitpicking style stuff that didn’t matter.”",
                after: "“The review flagged a pattern I’d used for years that doesn’t fit here. I asked why, adopted it, and now I review for it too.”"
              }
            ]
          },
          {
            type: "callout",
            tone: "quote",
            icon: "quote",
            text: "This is the debrief, almost verbatim, that I’ve heard sink a strong candidate: “Technically? Easily the best we saw. But every story was *I* - I decided, I fixed, I was right. I couldn’t find the team in any of it. I don’t know how he takes a code review and I’m not sure I want to find out on the job.” He out-coded everyone and lost the offer to signal #1. Don’t be that résumé."
          },
          {
            type: "callout",
            tone: "insight",
            icon: "target",
            text: "Carry one number forward - the **Teammate Quotient.** After you draft each STAR story, ask: *how many of the five signals does this story let me show?* A story that proves collaboration AND ownership AND communication is worth three thin stories. Aim for a Story Bank where your five stories cover all five signals at least twice over. (That mapping is my calibration from real rubrics - keep the five signals; tune the weighting to the roles you’re chasing.)"
          }
        ],
        oneLiner: "It isn’t a personality test. It’s a scorecard - and now you’ve seen it."
      },
      {
        n: "03",
        eyebrow: "The framework",
        title: "STAR - the structure that makes a second language sound fluent",
        lead: "Almost every behavioral answer is a story, and unstructured stories are where good candidates drown - especially in a second language, where rambling costs double. STAR is the four-part skeleton that holds every answer up. Boring? Yes. It works *because* it’s boring.",
        blocks: [
          {
            type: "figure",
            figure: {
              kind: "weeklyLoop",
              steps: [
                {
                  label: "Situation",
                  icon: "map"
                },
                {
                  label: "Task",
                  icon: "target"
                },
                {
                  label: "Action",
                  icon: "bolt"
                },
                {
                  label: "Result",
                  icon: "star"
                }
              ],
              repeat: false
            },
            caption: "Four beats, in order, every time. It’s not a cycle - it’s a track you run start to finish so you never get lost mid-answer."
          },
          {
            type: "ul",
            items: [
              {
                lead: "Situation - 1-2 sentences, no more.",
                text: "Set the scene fast: the team, the stakes, the problem. Newcomers blow their whole answer here, over-explaining context. Give just enough that the rest makes sense, then move."
              },
              {
                lead: "Task - your specific responsibility.",
                text: "What were *you* on the hook for? One sentence. This is where you quietly establish scope and ownership - ‘I was the lead on the migration,’ not ‘the team had to migrate.’"
              },
              {
                lead: "Action - the heart, 50-60% of your airtime.",
                text: "What *you* did, step by step, and *why*. The ‘why’ is what they’re scoring - it shows judgment. Use ‘I’ for your actions and ‘we’ for the team’s, deliberately; that one-word choice is what separates ‘team player’ from ‘lone hero’ on the rubric."
              },
              {
                lead: "Result - land it on a number, then reflect.",
                text: "What happened, quantified where you can (‘cut deploy time 40 min → 6 min’), plus one line of what you learned or would repeat. The reflection is what turns a war story into evidence of growth."
              }
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "spark",
            text: "The fluency hack hiding inside STAR: structure reads as fluency. An interviewer following a clean Situation → Task → Action → Result literally cannot get lost, so they never *experience* your English as a struggle - they experience your answer as clear. You’re not hiding an accent; you’re removing every other reason for confusion so the accent stops mattering. **Structure is the great equalizer for the non-native speaker.** This is the single most important sentence in the module if English worries you."
          },
          {
            type: "callout",
            tone: "warning",
            icon: "bolt",
            text: "The two STAR failure modes I see most: **(1) The endless Situation** - three minutes of backstory, no Action. Fix: time-box Situation to two sentences. **(2) The missing Result** - a great story that just… stops, with no outcome. Fix: never end an answer without a result and a number. If you can’t quantify it, end on the qualitative change: ‘the on-call pages dropped to almost nothing.’ A story with no result reads as a story with no point."
          }
        ],
        oneLiner: "Structure reads as fluency. Master four beats and your English stops being the story."
      },
      {
        n: "04",
        eyebrow: "Worked example",
        title: "One story, two ways - watch a ‘good’ engineer become a ‘great teammate’",
        lead: "Theory’s cheap. Here’s the exact same true event, told two ways, against the prompt straight from the question bank: *“Tell me about a time you disagreed with a teammate.”* The facts don’t change. The framing changes everything - and so does the score.",
        blocks: [
          {
            type: "h",
            text: "Version A - the lone hero (how most strong newcomers tell it)"
          },
          {
            type: "callout",
            tone: "warning",
            icon: "user",
            text: "“A teammate wanted to use MongoDB for the new service. I knew that was wrong - our data was clearly relational. I explained that NoSQL would cause problems with our joins and transactions. He didn’t agree at first, but I showed him the schema and eventually he understood I was right. We used PostgreSQL and it worked fine. So I think it’s important to stand by the correct technical decision.”"
          },
          {
            type: "p",
            text: "Everything in there is true, and technically he was right. So why does it score *low*? It’s all *I*: I knew, I explained, he understood I was right. There’s no curiosity about why a smart colleague wanted Mongo, no listening, no shared decision - just a correct person overruling a wrong one. The interviewer learns he’s competent and learns nothing reassuring about whether he’s safe in a disagreement. On signal #1, this is close to a fail."
          },
          {
            type: "h",
            text: "Version B - the same event, STAR + teammate signals"
          },
          {
            type: "callout",
            tone: "quote",
            icon: "check",
            text: "“**(S)** On a new payments service, a teammate proposed MongoDB while I was leaning PostgreSQL - and we had to commit that week. **(T)** As the one who’d own the data layer, I wanted us to get this right, not just get *my* way. **(A)** So first I asked what was drawing him to Mongo - turned out he was worried about a schema that might change a lot early on, which was a fair concern I hadn’t weighted. I shared my worry about transactional integrity for *payments* specifically, and suggested we list the two or three things we couldn’t afford to get wrong. Once ‘never lose a transaction’ was top of the list, we both landed on Postgres - and I took his flexibility concern and built in a JSONB column for the parts that were genuinely fluid. **(R)** We shipped on time, zero data-integrity incidents in the first year, and honestly the JSONB compromise was better than my original all-rigid design. I learned to ask ‘what’s the worry behind the proposal’ before I argue the proposal.”"
          },
          {
            type: "p",
            text: "Same MongoDB-vs-Postgres disagreement. Same outcome - they used Postgres. But look what version B *shows*: he asked first (collaboration), he genuinely incorporated the other view (the JSONB compromise - coachability), he reasoned from stakes not ego (judgment), and he reflected at the end (growth). One event, four of the five signals, and he comes across as someone you’d *want* to disagree with. **That is the entire game.**"
          },
          {
            type: "figure",
            figure: {
              kind: "beforeAfterBullet",
              before: "I knew NoSQL was wrong, explained why, and he eventually understood I was right.",
              after: "I asked what was drawing him to Mongo, surfaced the real worry, and we landed together on Postgres - with a JSONB compromise that beat my original design.",
              issue: "Version A proves you’re right. Version B proves you’re a teammate. This round scores the second one.",
              labelBefore: "Before",
              labelAfter: "After",
              cta: "Reframe it",
              ctaBack: "Show the original"
            },
            caption: "Toggle it. The facts are identical - only the framing moves, and the framing is the whole score."
          },
          {
            type: "callout",
            tone: "insight",
            icon: "chat",
            text: "The named technique, and the one line to memorize from this module: **‘What’s the worry behind the proposal?’** When you disagree, your first move is never to argue your side - it’s to ask what the other person is protecting. It instantly reframes a clash of egos into a shared hunt for the real constraint, and it’s *catnip* to a Canadian interviewer, because it’s exactly how healthy teams here actually run a disagreement. Use it in the room; use it on the job."
          }
        ],
        oneLiner: "Don’t tell the story where you won. Tell the story where the team did."
      },
      {
        n: "05",
        eyebrow: "Decode the phrase",
        title: "‘Canadian politeness’ decoded - what the words in the room actually mean",
        lead: "The thing that disorients newcomers most isn’t the questions - it’s that Canadian professional English runs on *indirection*. Directness that’s normal and respected in many cultures reads here as blunt; the local softening reads to newcomers as wishy-washy. Both sides misread each other. Here’s the decoder.",
        blocks: [
          {
            type: "p",
            text: "This is not about being fake or swallowing your opinion. Strong opinions are welcome here - *how* you package them is the whole difference. Learn to hear the real message under the soft wrapper, and to wrap your own the same way."
          },
          {
            type: "decode",
            items: [
              {
                worry: "“That’s an interesting approach…” (and a pause)",
                signal: "Usually a soft *no*, or real doubt. It’s an invitation to defend or reconsider, not a compliment. Read the pause. The right move: ‘Happy to hear what’s giving you pause - what am I missing?’"
              },
              {
                worry: "“I might be wrong, but have we considered…?”",
                signal: "They are usually *not* wrong and are fairly sure. The hedge is politeness, not genuine uncertainty. Take the suggestion seriously - it’s often a real, load-bearing concern wearing a humble coat."
              },
              {
                worry: "“Maybe we could think about possibly doing X?”",
                signal: "Often a fairly firm recommendation, softened so it doesn’t feel imposed. Decode it as ‘I think we should do X’ - and engage with the substance, not the hedging."
              },
              {
                worry: "“Just a small thing / a quick thought -”",
                signal: "Frequently introduces the *most* important point. ‘Just’ and ‘small’ are social lubricant, not a measure of weight. When you hear ‘just,’ lean in."
              },
              {
                worry: "Your own direct ‘No, that’s wrong, we should do X.’",
                signal: "Technically fine, socially expensive here - reads as abrupt even when you’re right. Re-wrap: ‘I see it a bit differently - can I walk through a concern?’ Same content, lands as collaborative instead of combative."
              }
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "globe",
            text: "The reframe that makes this clickable: Canadian indirection isn’t weakness or inefficiency - it’s a protocol for **disagreeing without making it personal**, so the relationship survives the argument and tomorrow’s standup isn’t awkward. It’s the spoken twin of Module 2’s lesson: *right at home, wrong room for here.* Your directness isn’t a flaw to apologize for - it’s a register to translate. Keep the spine of your opinion; change the packaging."
          },
          {
            type: "h",
            text: "Three everyday rituals where this plays out - and how to show up"
          },
          {
            type: "ul",
            items: [
              {
                lead: "Code review.",
                text: "Here it’s normal, frequent, and *not* personal - your code gets picked apart daily and that’s a healthy team, not an insult. Give feedback as questions (‘what do you think about pulling this into its own function?’) not commands. Receiving it: thank the reviewer, ask why if you don’t see it, never get defensive. How you take a review IS signal #5."
              },
              {
                lead: "Standup.",
                text: "Short, honest, blameless. ‘I’m blocked on X, could use a hand’ is *expected* and reads as a strong teammate - not as weakness or losing face. Hiding a blocker to look competent is the actual red flag here. Flag problems early; that’s the norm."
              },
              {
                lead: "Disagreement in a meeting.",
                text: "Use ‘yes, and’ over ‘no, but.’ Acknowledge the other view genuinely before adding yours (‘that handles the read path well - I’m wondering about writes under load’). You can be just as firm; you’re just not making the other person wrong to be right."
              }
            ]
          }
        ],
        oneLiner: "Keep the spine of your opinion. Change only the packaging - that’s not fake, it’s fluent."
      },
      {
        n: "06",
        eyebrow: "Run it like an engineer",
        title: "The landmine questions - and a rehearsal loop that actually sticks",
        lead: "A handful of questions sink newcomers not because they’re hard, but because the *honest, instinctive* answer is wrong for this room. Here are the scripted moves - not words to memorize, but the shape of a safe answer - plus a weekly loop to make them automatic under pressure.",
        blocks: [
          {
            type: "table",
            title: "The landmine questions - instinct vs. the answer that scores",
            note: "Straight from the kinds of prompts you’ll get. The ‘scripted move’ is a shape to make your own with a real story - never a line to recite. Honesty rule throughout: every story must be true; framing true events well is the skill, inventing them is the thing that gets you caught in references.",
            cols: [
              "The question",
              "The instinct that backfires",
              "The scripted move that scores"
            ],
            rows: [
              [
                "“Tell me about a time you disagreed with a teammate.”",
                "Tell the story where you were right and won.",
                "Tell the story where you asked ‘what’s the worry behind the proposal,’ listened, and the team reached a better answer - ideally one where you changed your mind."
              ],
              [
                "“Describe a project that failed.”",
                "Pick a tiny ‘failure’ or blame external factors / QA / requirements.",
                "Pick a real failure, own your specific part plainly, and land hard on the concrete process change you made after. Ownership + growth in one."
              ],
              [
                "“What’s your greatest weakness?”",
                "A humblebrag (‘I work too hard’) - interviewers groan at it.",
                "A real, non-fatal weakness for the role + the system you built to manage it. ‘I used to under-communicate when heads-down; now I post a daily async update.’"
              ],
              [
                "“Why do you want to work in Canada / here?”",
                "Generic gratitude, immigration logistics, ‘better life.’",
                "Tie it to *this team’s actual work* and long-term commitment. Concrete and specific beats grateful and vague - they’re screening for someone who’ll stay and engage."
              ],
              [
                "“How do you handle ambiguous requirements?”",
                "‘I ask my manager for the full spec before I start.’",
                "Show the loop: ask clarifying questions → propose the smallest scope that proves the idea → confirm → build. Ambiguity is signal #4; this is the answer to it."
              ],
              [
                "“Why are you leaving / why the gap?”",
                "Over-explain, sound bitter, or apologize for relocating.",
                "One calm, neutral, forward-looking line. ‘I relocated to Canada and took time to settle; now I’m focused on the right local role.’ Then move on - don’t dwell."
              ]
            ]
          },
          {
            type: "callout",
            tone: "warning",
            icon: "close",
            text: "The one hard ethical line, same as Module 2: **never invent a story, a metric, or a role you didn’t hold.** Reframing a true disagreement to highlight collaboration is *skill*. Fabricating a project is a lie that unravels the moment they ask a follow-up (‘what would you do differently?’ has no good answer for a fake story) or call a reference. Frame aggressively; fabricate never. Beyond ethics, it’s the safer bet - true stories survive follow-ups."
          },
          {
            type: "p",
            text: "Knowing the answers isn’t the same as being able to *deliver* them when adrenaline hits and your second language gets harder to reach. That’s a rehearsal problem, and rehearsal has a loop:"
          },
          {
            type: "figure",
            figure: {
              kind: "weeklyLoop",
              steps: [
                {
                  label: "Draft 1 STAR story",
                  icon: "doc"
                },
                {
                  label: "Say it ALOUD, timed",
                  icon: "chat"
                },
                {
                  label: "Record & rewatch",
                  icon: "play"
                },
                {
                  label: "Cut to ~90 sec",
                  icon: "bolt"
                },
                {
                  label: "Map it to the 5 signals",
                  icon: "target"
                }
              ]
            },
            caption: "The rule that makes it work: rehearse OUT LOUD, never silently in your head. Silent rehearsal trains an answer you can’t actually deliver."
          },
          {
            type: "callout",
            tone: "insight",
            icon: "bolt",
            text: "Why ‘aloud’ is non-negotiable, especially in a second language: silent rehearsal runs in your fluent inner voice and lies to you about how it’ll sound. The words that tangle, the place you run out of breath, the spot where you blank - they only appear when air actually moves. Record yourself once and rewatch; it’s uncomfortable and it’s the highest-leverage hour in this whole module. Bullet points, never a script - memorized scripts collapse the instant they ask a follow-up."
          }
        ],
        oneLiner: "You don’t rise to the occasion. You fall to the level of what you rehearsed out loud."
      },
      {
        n: "07",
        eyebrow: "The long game",
        title: "If your spoken English genuinely needs work - read this, not around it",
        lead: "Module 2 promised the resume handles *written* register and the interview handles *spoken* - this is where I keep that promise, honestly, with no comforting hand-waving. If speaking is your real worry, this section is the most important one in the course for you.",
        blocks: [
          {
            type: "p",
            text: "First, the honest part, because you’d catch me if I lied: spoken fluency *is* assessed, and a real comprehension gap - where you and the interviewer keep missing each other - can cost you an offer. I won’t pretend it can’t. But almost everyone in this spot is misdiagnosing *what* is being judged, and fixing the wrong thing."
          },
          {
            type: "figure",
            figure: {
              kind: "locusFlip",
              external: [
                "Your accent",
                "Speaking ‘like a native’",
                "Sounding effortless",
                "Never searching for a word"
              ],
              controllable: [
                "Structure (STAR) so you’re never lost",
                "Pace - slowing down on purpose",
                "A repair phrase for when you blank",
                "Pre-built stories so it’s recall, not invention"
              ],
              leftLabel: "What you can’t change (and they’re not grading)",
              rightLabel: "What you can change (and it’s what they grade)",
              leftIcon: "close",
              rightIcon: "check"
            },
            caption: "Almost everyone pours their prep into the left column. Every point of leverage is on the right."
          },
          {
            type: "ul",
            items: [
              {
                lead: "Accent is not the problem - clarity is.",
                text: "Interviewers in Canada work with accented English all day; the country runs on it. They are not scoring how ‘native’ you sound. They’re scoring whether they can follow you. Those are completely different targets, and only one is your job."
              },
              {
                lead: "Slow down - it reads as senior, not as struggling.",
                text: "Under nerves everyone speeds up, which is precisely when a second language degrades. Deliberately slowing down does two things at once: it makes you clearer, and (this surprises people) it reads as *thoughtful and senior*. Rushed reads as junior. Pauses are allowed. Pauses are good."
              },
              {
                lead: "Build a repair phrase before you need one.",
                text: "Going blank mid-sentence isn’t failure - *handling* it badly is. Pre-load one calm line: ‘Let me put that a different way,’ or ‘The word’s escaping me - the idea is…’. Recovering smoothly from a stumble actually demonstrates communication skill. Freezing in silence is the only real miss."
              },
              {
                lead: "Ask for a repeat - confidently, not apologetically.",
                text: "Didn’t catch the question? ‘Could you rephrase that?’ is a *strong* move, not a weak one. Answering the wrong question because you were too anxious to ask is far worse than asking. Natives do this constantly; so should you."
              },
              {
                lead: "Prep converts speaking into recall.",
                text: "This is the unlock. An unprepared answer is *live translation under stress* - the hardest possible mode for a second language. A prepared STAR story is *recall* - you’re retrieving English you’ve already rehearsed aloud. Your Story Bank doesn’t just organize content; it quietly removes 80% of the live-language load. That’s why it exists."
              }
            ]
          },
          {
            type: "callout",
            tone: "quote",
            icon: "quote",
            text: "A hiring manager I trust, in a debrief about a candidate with a heavy accent and clear hesitations: “His English isn’t polished, sure. But every answer was structured, he asked good clarifying questions, and when he got stuck he just said ‘let me rephrase’ and nailed it. That’s exactly how he’ll communicate on the team. Strong hire.” Clear-and-accented beat fluent-and-shapeless. It almost always does."
          },
          {
            type: "callout",
            tone: "insight",
            icon: "check",
            text: "And the honest floor, because you deserve the truth: if comprehension genuinely breaks down both ways in real conversation, that’s a real gap - and the highest-ROI move is targeted spoken practice (a tutor, a conversation group, weekly mocks) *alongside* this course, not instead of it. That’s not a refund-worthy disappointment; it’s the actual answer, and the people who act on it close the gap in months. This is also exactly what the Interview Prep mock is built to pressure-test."
          },
          {
            type: "h",
            text: "Protect your nerves like the input they are"
          },
          {
            type: "ul",
            items: [
              "Book your lower-priority interviews first. Your fifth real interview is worlds better than your first - spend the early reps where the stakes are lower.",
              "Reframe the room: it’s a conversation between two engineers about work, not an interrogation. The interviewer is usually *hoping* you’re the one so they can stop interviewing.",
              "A little silence to think is fine, and reads as senior. You don’t have to fill every gap the instant it appears - especially not in a second language.",
              "Have two questions ready to ask them. ‘How does this team handle disagreement on technical decisions?’ both signals you get the culture and gives you real data on whether you want the job."
            ]
          }
        ],
        oneLiner: "They’re not grading your accent. They’re grading whether they can follow you - and that you can fix."
      }
    ],
    assignment: {
      title: "Your Week-4 Story Bank",
      intro: "You won’t finish this module with interview tips. You’ll finish holding five written, signal-mapped STAR stories and one disagreement answer you’ve rehearsed aloud and timed - a Story Bank you walk into every interview carrying. Build it now; you’ll reuse it for every loop in the rest of your search.",
      steps: [
        {
          lead: "Draft five STAR stories.",
          text: "One real story for each of the five signals (collaboration, ownership, communication, ambiguity, growth). Write each as four short labeled beats - S/T/A/R - not a paragraph. Use the table below as your template."
        },
        {
          lead: "Map each story to the signals.",
          text: "For every story, note which of the five signals it lets you show. Compute your Teammate Quotient: each signal should be covered by at least two stories. Find the thin spots and add or re-angle a story to cover them."
        },
        {
          lead: "Rehearse the disagreement answer aloud.",
          text: "Take your collaboration story - the ‘time you disagreed’ - and run the section-6 loop: say it aloud, record it, rewatch, cut to ~90 seconds, and make sure ‘what’s the worry behind the proposal’ shows up in your Action. This is the one answer you cannot afford to wing."
        },
        {
          lead: "Pre-build your repair kit.",
          text: "Write your one repair phrase (‘let me put that a different way’), your one clarifying-question phrase (‘could you rephrase that?’), and your two questions to ask them. Three lines that turn a freeze into a recovery."
        }
      ],
      blocks: [
        {
          type: "h",
          text: "Your Story Bank - a worked example (the disagreement story, filled in)"
        },
        {
          type: "table",
          note: "One row of your bank, fully built from the section-4 example. Yours will hold five rows like this - one real story per signal. Keep the beats short; in the room you expand them, on paper you skeleton them.",
          cols: [
            "Beat",
            "What you actually say (skeleton - expand live)"
          ],
          rows: [
            [
              "Situation",
              "New payments service, teammate proposed MongoDB, I leaned Postgres, had to commit that week."
            ],
            [
              "Task",
              "I owned the data layer - wanted the right call, not my way."
            ],
            [
              "Action",
              "Asked what drew him to Mongo (schema churn fear) → shared my transactional-integrity worry → listed what we couldn’t afford to get wrong → landed together on Postgres + JSONB for the fluid parts."
            ],
            [
              "Result",
              "Shipped on time, zero data-integrity incidents in year one, his compromise beat my original design. Learned: ask the worry behind the proposal first."
            ],
            [
              "Signals shown",
              "Collaboration #1, Coachability #5, Ambiguity #4, Communication #3 - four of five in one story."
            ]
          ]
        },
        {
          type: "h",
          text: "Your signal-coverage check - fill this after drafting all five"
        },
        {
          type: "table",
          note: "A worked example of a *finished* bank’s coverage. Every signal hit at least twice = a Teammate Quotient that holds up no matter which question they open with. Build yours until no column has fewer than two checks.",
          cols: [
            "Story",
            "Collab",
            "Ownership",
            "Comms",
            "Ambiguity",
            "Growth"
          ],
          rows: [
            [
              "The MongoDB disagreement",
              "✓",
              "",
              "✓",
              "✓",
              "✓"
            ],
            [
              "The failed migration",
              "",
              "✓",
              "✓",
              "",
              "✓"
            ],
            [
              "The vague PM spec",
              "✓",
              "",
              "✓",
              "✓",
              ""
            ],
            [
              "The painful code review",
              "",
              "✓",
              "",
              "",
              "✓"
            ],
            [
              "The cross-team launch",
              "✓",
              "✓",
              "✓",
              "",
              ""
            ],
            [
              "Coverage (need ≥2)",
              "3",
              "3",
              "4",
              "2",
              "3"
            ]
          ]
        },
        {
          type: "callout",
          tone: "insight",
          icon: "rocket",
          text: "When this bank is built and the disagreement answer is rehearsed aloud, you’ve done what 90% of candidates never do - you’ve *prepared the behavioral round like an engineering problem* instead of hoping your personality carries it. Walk in with the bank in your head, run STAR, ask the worry behind the proposal, and slow down. That’s the whole module, holdable in one hand."
        }
      ]
    }
  },

  {
    id: "module-5",
    n: "05",
    of: "06",
    track: "Prove the tech",
    locked: false,
    title: "Sharpen only what gets tested",
    subtitle: "You don’t need a six-month LeetCode bootcamp. You need the handful of patterns Canadian loops actually reuse, one system-design script you can run cold, and a single portfolio piece that does the talking - built on purpose, not on grind.",
    meta: [
      "~28 min read",
      "1 portfolio project scoped",
      "the anti-burnout prep plan"
    ],
    build: "You’ll leave with a **two-week sharpening plan plus a scoped portfolio brief** - the named patterns to drill (and the ones to skip), one reusable design framework on a card, and a Canadian-problem project you can start this week and point recruiters at.",
    teaserNext: {
      id: "module-6",
      line: "Next - you’ve proven you can do the work. Module 6 makes sure you get paid properly for it: real numbers, the negotiation script, and the first 90 days."
    },
    sections: [
      {
        n: "01",
        eyebrow: "Clear the noise",
        title: "Four things you believe about the technical bar",
        lead: "You’re a working engineer. You’ve shipped real systems for years. And yet the phrase “technical interview” still tightens your chest - because four stories have been sold to you. Each has a grain of truth; each, left unchecked, makes you prepare for the wrong test.",
        blocks: [
          {
            type: "lies",
            items: [
              {
                claim: "I have to grind 500 LeetCode problems first.",
                grain: "Some companies - the big-tech ones - really do test hard algorithmic puzzles.",
                trap: "But they’re a *minority* of Canadian employers, and even they reuse a small set of patterns. Grinding 500 random problems is studying for a test most of your targets won’t give."
              },
              {
                claim: "My years of experience don’t count in there.",
                grain: "A whiteboard puzzle genuinely doesn’t care that you’ve run a platform team.",
                trap: "But system design, code review, and ‘how would you build this’ rounds reward exactly that experience - and most Canadian loops weight *those* heavily. Pick the loops that test what you already have."
              },
              {
                claim: "I’m too rusty on data structures to compete.",
                grain: "If you haven’t touched a heap by hand in eight years, you are rusty - that’s real.",
                trap: "Rust comes off in days, not months, once you drill *patterns* instead of problems. You’re not relearning CS; you’re re-indexing what you already know."
              },
              {
                claim: "A portfolio is for juniors with no experience.",
                grain: "Juniors do lean on portfolios to prove they can code at all.",
                trap: "For a newcomer, one sharp project is something else entirely: local, legible proof you can ship *here* - the single most efficient answer to ‘Canadian experience’ you can build yourself."
              }
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "spark",
            text: "Notice the shape: every one of these makes the mountain *bigger* than it is. The technical bar feels infinite because nobody told you it’s bounded. The whole job of this module is to draw the boundary - **prepare for the test you’ll actually be given, not the one your anxiety invented.**"
          },
          {
            type: "callout",
            tone: "warning",
            icon: "bolt",
            text: "The honesty line up front: I’m not telling you the work is easy or that prep is optional. I’m telling you it’s *finite and targeted.* If you’re aiming squarely at FAANG-Canada, your algorithm bar is genuinely higher - I’ll flag exactly where that changes the plan, so you don’t under-prepare for the loop you actually picked."
          }
        ],
        oneLiner: "The bar isn’t infinite. It just hasn’t been drawn for you yet."
      },
      {
        n: "02",
        eyebrow: "The machine",
        title: "What the loop actually tests - and what it doesn’t",
        lead: "Before you prep a single thing, you need a map of the rounds. A Canadian technical loop is not one test; it’s three or four different ones, each measuring something different. Prep the wrong one and you’ll out-study yourself into the wrong room.",
        blocks: [
          {
            type: "p",
            text: "Here’s the loop as I’ve run it from the other side - the rounds, what each is really probing, and (the part that saves you weeks) how much most non-FAANG Canadian companies actually weight it."
          },
          {
            type: "figure",
            figure: {
              kind: "threeReaders",
              readers: [
                {
                  name: "Coding / DSA round",
                  icon: "code",
                  time: "45-60 min",
                  who: "1-2 engineers, live",
                  wants: "that you can turn a problem into working code, talk while you do it, and reach for the right pattern - not that you memorized 500 problems"
                },
                {
                  name: "System / practical design",
                  icon: "globe",
                  time: "45-60 min",
                  who: "A senior eng or manager",
                  wants: "that you can scope an ambiguous problem, name trade-offs, and reason about scale out loud - this is where your real years pay off"
                },
                {
                  name: "Code review / practical",
                  icon: "doc",
                  time: "varies",
                  who: "The team you’d join",
                  wants: "that you write and *read* code like a teammate - clear PRs, sane tests, kind review comments. The most ‘Canadian’ round, and the most overlooked."
                }
              ]
            },
            caption: "Three rounds, three different muscles. The mistake is training only the first - when for most local employers the second and third carry as much weight."
          },
          {
            type: "h",
            text: "What gets tested vs. what doesn’t"
          },
          {
            type: "table",
            note: "My calibration from Canadian loops outside big-tech - directional, not a survey. FAANG-Canada shifts the left column much harder toward hard algorithms; tune this to the specific companies on your list.",
            cols: [
              "Tested more than you’d think",
              "Tested less than you fear"
            ],
            rows: [
              [
                "Pattern recognition (‘this is a sliding-window problem’)",
                "Obscure algorithms (red-black trees, Dijkstra from scratch)"
              ],
              [
                "Talking through trade-offs out loud",
                "Memorized textbook proofs"
              ],
              [
                "Clean, readable, testable code",
                "Code golf / the cleverest one-liner"
              ],
              [
                "Scoping a vague design prompt",
                "Drawing a ‘correct’ architecture from memory"
              ],
              [
                "How you take feedback mid-problem",
                "Getting the optimal solution with zero hints"
              ]
            ]
          },
          {
            type: "callout",
            tone: "quote",
            icon: "quote",
            text: "What I’m actually scoring on a coding round, written on my sheet: *‘Did they understand the problem before coding? Did they say their plan out loud? Did they test it? Were they pleasant to pair with?’* Optimal-on-the-first-try is maybe 20% of the score. A candidate who talked me through a clean brute-force, then improved it, beats a silent person who teleported to the perfect answer - every time."
          }
        ],
        oneLiner: "You’re not being tested on knowing everything. You’re being tested on how you think out loud."
      },
      {
        n: "03",
        eyebrow: "The framework",
        title: "The patterns that cover most of it",
        lead: "Here’s the promise the course made, made concrete: a small set of patterns covers the large majority of coding-round questions you’ll see. Learn to *recognize* these and you stop solving 500 problems and start solving 8 shapes. Drill the shape, not the puzzle.",
        blocks: [
          {
            type: "signals",
            items: [
              {
                n: "1",
                name: "Two pointers / sliding window",
                what: "One or two indices walking an array or string - a window that grows and shrinks.",
                why: "The single most common ‘easy-medium’ shape. Substrings, subarrays, pairs that sum, dedup, ‘longest/shortest … such that …’.",
                fix: "Tell: a contiguous sequence and a constraint on it. Drill ~6 problems until the window mechanics are automatic.",
                before: "Brute-forcing every substring in O(n²)",
                after: "One linear pass, two indices, a running count"
              },
              {
                n: "2",
                name: "Hash map for O(1) lookup",
                what: "Trade memory for time - store what you’ve seen so you never re-scan.",
                why: "Turns nested loops into single passes. Two-sum, frequency counts, grouping, ‘have I seen this before?’ - it’s everywhere.",
                fix: "Tell: ‘for each element, have I already seen its partner/complement?’ If yes, reach for a map first.",
                before: "Two nested loops checking every pair",
                after: "One pass, look the complement up in a set"
              },
              {
                n: "3",
                name: "Binary search (and ‘search the answer’)",
                what: "Halve the space each step - on a sorted array, or on a *range of possible answers*.",
                why: "Not just for sorted arrays. ‘Minimum capacity such that…’, ‘smallest k that works’ are binary search in disguise - the advanced tell most people miss.",
                fix: "Tell: sorted input, OR a monotonic ‘does X work?’ you can answer yes/no. Drill the off-by-one boundary until it’s muscle.",
                before: "Linear scan, or guessing the threshold",
                after: "log-n search over the answer space"
              },
              {
                n: "4",
                name: "BFS / DFS on graphs & trees",
                what: "Visit nodes level-by-level (queue) or depth-first (stack/recursion). A grid is a graph too.",
                why: "Trees, grids, ‘number of islands’, shortest unweighted path, dependency order. One traversal skeleton solves a whole genre.",
                fix: "Memorize ONE clean BFS and ONE DFS template you can write in 90 seconds; adapt per problem. Most grid/tree questions are a 10-line edit.",
                before: "Reinventing traversal under pressure",
                after: "Paste your template, change the visit logic"
              },
              {
                n: "5",
                name: "Heap / top-K",
                what: "A priority queue that keeps the best K things without sorting everything.",
                why: "‘K largest’, ‘K closest’, ‘merge K lists’, streaming medians. The keyword *K* in a problem is a near-certain tell.",
                fix: "Know your language’s heap API cold (it’s the part people fumble). Tell: ‘top/smallest K’ or ‘merge sorted streams.’",
                before: "Sorting the whole array to take 3 items",
                after: "A size-K heap in one pass"
              },
              {
                n: "6",
                name: "Intervals",
                what: "Sort by start, then sweep - merge, insert, or count overlaps.",
                why: "Meeting rooms, calendars, merging ranges. A small genre, but it shows up constantly and the approach is always the same.",
                fix: "Tell: the input is ranges with start/end. Step one is almost always ‘sort by start.’",
                before: "Comparing every interval to every other",
                after: "Sort once, sweep left to right"
              },
              {
                n: "7",
                name: "Dynamic programming (the gentle slice)",
                what: "Break a problem into overlapping subproblems and cache the answers - usually a 1-D or 2-D table.",
                why: "The scariest name, but most *interview* DP is a handful of templates: climbing stairs, coin change, longest common subsequence, grid paths.",
                fix: "Don’t try to ‘master DP.’ Learn those 4-5 canonical problems cold; 80% of interview DP is a variation. Tell: ‘count the ways’ or ‘min/max over choices.’",
                before: "Exponential recursion that times out",
                after: "Memoize the recursion - same code, one cache"
              },
              {
                n: "8",
                name: "Stack / monotonic stack",
                what: "Last-in-first-out - and the ‘keep a stack that only increases/decreases’ trick.",
                why: "Matching brackets, ‘next greater element’, expression parsing, histogram problems. The monotonic variant is the one senior rounds love.",
                fix: "Tell: nesting/matching, or ‘the next bigger/smaller thing to the right.’ Learn the monotonic template; it’s the high-value one.",
                before: "Nested scans for the next greater element",
                after: "One pass with a monotonic stack"
              }
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "target",
            text: "Carry one number, honestly labeled: in my experience these eight shapes cover the *large majority* of non-FAANG coding rounds - call it 80% as a planning figure, not a measured stat (the marketing rounds it the same way). The point isn’t the exact percent; it’s that the list is **short and finite.** Drill recognition - ‘what shape is this?’ - over solving. Speed of recognition is what the timer actually rewards."
          },
          {
            type: "callout",
            tone: "warning",
            icon: "bolt",
            text: "FAANG-Canada caveat: if Shopify’s harder loops, Amazon, or Google are on your list, add *advanced graphs, harder DP, and tries* and budget real weeks - their bar is genuinely higher. Everyone else: the eight above, drilled for recognition, are plenty. Don’t prep for Google to interview at a 40-person Toronto fintech."
          }
        ],
        oneLiner: "Stop solving 500 problems. Start recognizing 8 shapes."
      },
      {
        n: "04",
        eyebrow: "Run it cold",
        title: "One system-design script you can run on any prompt",
        lead: "The design round terrifies people because it feels open-ended. It isn’t. There’s one script that works on ‘design a URL shortener,’ ‘design Uber,’ or ‘design our notification service’ - and it’s built from the exact judgment your years gave you. Memorize the steps; improvise the content.",
        blocks: [
          {
            type: "p",
            text: "The secret the round is actually testing: **can you make an ambiguous problem tractable, out loud, like a senior engineer?** Nobody expects a correct architecture from memory. They expect you to scope, structure, and reason about trade-offs. This six-step loop gives you a spine so you never freeze on the blank whiteboard."
          },
          {
            type: "figure",
            figure: {
              kind: "weeklyLoop",
              steps: [
                {
                  label: "Clarify & scope",
                  icon: "chat"
                },
                {
                  label: "Estimate scale",
                  icon: "target"
                },
                {
                  label: "Define the API",
                  icon: "code"
                },
                {
                  label: "Sketch components",
                  icon: "map"
                },
                {
                  label: "Pick data & storage",
                  icon: "doc"
                },
                {
                  label: "Stress it: bottlenecks",
                  icon: "bolt"
                }
              ],
              repeat: false
            },
            caption: "The R.E.A.S.O.N. spine - run it top to bottom on any prompt. The figure repeats, but a design talk doesn’t loop; just walk the six steps in order."
          },
          {
            type: "h",
            text: "The six steps, with the words to actually say"
          },
          {
            type: "ul",
            items: [
              {
                lead: "1 · Clarify & scope (don’t skip this - it’s graded).",
                text: "Ask: who uses it, what are the core 2-3 features, what’s explicitly out of scope? Say: ‘Before I design, let me nail down what we’re building and what we’re *not.*’ Cutting scope out loud is a senior signal, not a weakness."
              },
              {
                lead: "2 · Estimate scale.",
                text: "Rough numbers: users, reads/sec, writes/sec, data size. Say: ‘Let’s assume 10M daily users, ~100:1 read/write - that pushes us toward heavy caching.’ The numbers drive every later decision, which is the whole point."
              },
              {
                lead: "3 · Define the API.",
                text: "Name the 2-3 core endpoints. Say: ‘POST /shorten takes a URL, returns a key; GET /{key} redirects.’ Concrete contracts stop the conversation from floating in the abstract."
              },
              {
                lead: "4 · Sketch the components.",
                text: "Client → load balancer → service → cache → database, plus anything async (queue, workers). Say: ‘Here’s the happy path, then I’ll harden it.’ Draw boxes and arrows; narrate the request’s journey."
              },
              {
                lead: "5 · Pick data & storage.",
                text: "SQL vs NoSQL and *why*, the schema, the index, how you key it. Say: ‘Reads dominate and the access is by-key, so a key-value store with the short code as the key fits.’ Justify with the numbers from step 2."
              },
              {
                lead: "6 · Stress it - find the bottleneck.",
                text: "Where does it break at 10×? Add caching, a read replica, sharding, a CDN. Say: ‘The redirect path is the hot read, so I’d cache aggressively and add read replicas before I shard.’ Naming the bottleneck unprompted is the strongest senior tell in the room."
              }
            ]
          },
          {
            type: "callout",
            tone: "quote",
            icon: "quote",
            text: "I once watched a candidate freeze on ‘design a URL shortener’ for ninety seconds, then start drawing boxes at random. Same week, a less ‘impressive’ engineer just said, calmly, ‘Let me scope this first - who’s using it and how big?’ and walked the steps. The second one got the offer. The round isn’t a memory test. It’s a *do-you-have-a-process* test - so bring a visible one."
          },
          {
            type: "callout",
            tone: "insight",
            icon: "globe",
            text: "The newcomer-specific edge: this round is *language-friendly.* It rewards clear, structured thinking over fast idiomatic English. If spoken fluency is a worry (Module 4’s territory), design is the round where a calm, well-signposted process - ‘first… next… the trade-off here is…’ - covers for an accent completely. Lean into it."
          }
        ],
        oneLiner: "Don’t memorize architectures. Memorize the six steps and let your experience fill them in."
      },
      {
        n: "05",
        eyebrow: "Build the proof",
        title: "The portfolio piece - one Canadian problem, shipped",
        lead: "This is the asset that does double duty: it sharpens your skills *and* answers ‘Canadian experience’ in a way nothing else you can build yourself can. Not a tutorial clone. One small, real, *local* problem - built and deployed so a recruiter can click it.",
        blocks: [
          {
            type: "p",
            text: "The reframe: a portfolio for a senior newcomer isn’t about proving you can code - your resume already claims that. It’s about proving you can ship something that understands *here.* A project framed around a Canadian problem says, in one link, ‘I’m already operating in this market’ - which is exactly the doubt Module 1 named."
          },
          {
            type: "h",
            text: "What makes a project actually open doors"
          },
          {
            type: "ul",
            items: [
              {
                lead: "Solves a recognizably Canadian problem.",
                text: "Pick something a local interviewer will instantly *get*: a TTC/GO transit-delay tracker, a tool that compares grocery prices across Loblaws/Metro, a newcomer guide to filing Canadian taxes, a ‘which province for my NOC’ helper. Familiarity is the hook."
              },
              {
                lead: "Small but complete and *deployed*.",
                text: "A live URL beats a sprawling repo nobody runs. Frontend + an API + a database + deployed to a real host. Done and clickable beats ambitious and half-built - every time."
              },
              {
                lead: "Uses real public Canadian data.",
                text: "Open-data portals (Toronto, Vancouver, StatCan, open transit feeds) give you genuine datasets. Working with real, messy local data is itself a signal you’re engaging with this place."
              },
              {
                lead: "Reads like a professional repo.",
                text: "A clear README (problem, demo link, stack, how to run), sensible commits, basic tests, a clean PR history. The *repo* is a writing sample for the code-review round - treat it like one."
              }
            ]
          },
          {
            type: "figure",
            figure: {
              kind: "locusFlip",
              leftLabel: "Tutorial clone (skip)",
              rightLabel: "Door-opener (build)",
              leftIcon: "close",
              rightIcon: "check",
              external: [
                "Another to-do app or weather clone",
                "Cloned from a YouTube tutorial",
                "Runs only on your laptop",
                "Generic ‘users’ and fake data",
                "No README, 1 commit"
              ],
              controllable: [
                "A TTC delay tracker / grocery price compare",
                "Your own problem, your own choices",
                "Deployed to a live, clickable URL",
                "Real Canadian open-data",
                "README + tests + a clean PR trail"
              ]
            },
            caption: "Same effort, wildly different signal. The right column is what a hiring manager actually clicks through and remembers."
          },
          {
            type: "callout",
            tone: "insight",
            icon: "rocket",
            text: "The ‘this alone was worth it’ asset - the **Portfolio-to-Interview Bridge.** Don’t just *have* the project; mine it for interview ammunition. Every real build hands you a STAR story (‘a time I debugged something hard’ → that gnarly transit-API bug), a system-design walkthrough (your own architecture, which you can defend better than any textbook’s), and a code-review sample. One project, fueling all three rounds - that’s why one sharp project beats ten half-finished ones."
          },
          {
            type: "callout",
            tone: "warning",
            icon: "bolt",
            text: "Scope discipline, because engineers over-build: ship a *small* version in two to three weeks, deployed, then stop. A polished small thing that’s live beats an ambitious thing that’s 70% done forever. ‘Deployed and clickable’ is the bar. Resist the urge to add the fifth feature."
          }
        ],
        oneLiner: "Don’t clone a tutorial. Ship one small Canadian problem - and let it fuel every round."
      },
      {
        n: "06",
        eyebrow: "The norms",
        title: "Engineering as it’s run here - PRs, docs, agile",
        lead: "Passing the puzzle gets you the offer; reading the local norms gets you *kept.* And the on-the-job style leaks into the interview - especially the code-review and behavioral rounds - so it’s worth knowing before you’re in the room. Mostly small deltas, but they signal ‘already fits.’",
        blocks: [
          {
            type: "decode",
            items: [
              {
                worry: "Pull requests & code review",
                signal: "Small, focused PRs with a clear description (what + why) are the norm - not giant ‘did everything’ branches. Review comments are *kind, specific, and non-blocking by default*: ‘nit:’ for trivia, questions over commands (‘what do you think about…?’). Reviewing well matters as much as coding."
              },
              {
                worry: "Documentation & async",
                signal: "Teams here lean async - a written design doc before big work, decisions captured in writing (an RFC/ADR), Slack threads over interrupting. ‘Write it down so the team can read it later’ is a cultural default, not bureaucracy. Your portfolio README is you practicing exactly this."
              },
              {
                worry: "Agile, as actually practiced",
                signal: "Usually lightweight Scrum or Kanban: short standups (blockers, not status theatre), two-week sprints, retros where you can safely say ‘this didn’t work.’ It’s less ceremony than the textbook - over-formalizing it reads as junior."
              },
              {
                worry: "Estimates & pushing back",
                signal: "You’re expected to give honest estimates and *flag risk early* - surfacing ‘this will take longer because…’ is valued, not penalized. Silent heroics that miss a deadline are the anti-pattern. Disagreeing respectfully in a doc or PR is a senior signal here."
              }
            ]
          },
          {
            type: "callout",
            tone: "quote",
            icon: "quote",
            text: "A reference call I actually made about a newcomer hire: ‘Does he write good PRs?’ The answer - ‘his pull requests are so clear I barely need to ask questions, and his review comments made the whole team better’ - closed it on the spot. Not the algorithms. The *collaboration surface.* That’s what a Canadian team is buying."
          },
          {
            type: "callout",
            tone: "insight",
            icon: "check",
            text: "If your home engineering culture was more hierarchical or solo-hero - more ‘the senior decides, juniors implement silently’ - none of this is a knock on you. It’s the same ‘right at home, wrong workplace’ from Module 2, applied to *how you work.* Surface your reasoning, write things down, review kindly: that’s the whole adaptation, and your portfolio repo is where you rehearse it for free."
          }
        ],
        oneLiner: "The puzzle gets you the offer. The collaboration surface gets you kept."
      },
      {
        n: "07",
        eyebrow: "Run it like an engineer",
        title: "A two-week sharpening loop that won’t burn you out",
        lead: "You don’t have six months and you don’t need them. Here’s a measurable, finite loop - built so you can see the boundary of the work and stop, instead of grinding into the anxiety pit. Two weeks, repeatable, scoped to *what’s tested.*",
        blocks: [
          {
            type: "figure",
            figure: {
              kind: "weeklyLoop",
              steps: [
                {
                  label: "Pick ONE pattern",
                  icon: "target"
                },
                {
                  label: "Drill ~5 problems",
                  icon: "code"
                },
                {
                  label: "1 design rep (the 6 steps)",
                  icon: "globe"
                },
                {
                  label: "Advance the portfolio",
                  icon: "rocket"
                },
                {
                  label: "Log what’s shaky",
                  icon: "map"
                }
              ]
            },
            caption: "One pattern per session - not all eight at once. Same one-variable discipline as the funnel loop: depth beats a frantic sweep."
          },
          {
            type: "h",
            text: "A concrete two-week plan (the worked example)"
          },
          {
            type: "table",
            note: "My calibration for a working engineer with ~1-2 focused hours a day - compress or stretch to your reality and your target loop. FAANG-track readers: roughly double the coding weeks.",
            cols: [
              "Days",
              "Coding focus",
              "Design / portfolio"
            ],
            rows: [
              [
                "1-2",
                "Two pointers + sliding window (~8 problems)",
                "Scope the portfolio: pick the Canadian problem, find the dataset"
              ],
              [
                "3-4",
                "Hash maps + intervals (~8 problems)",
                "Build: API + DB skeleton, first commit"
              ],
              [
                "5-6",
                "BFS/DFS + one design rep (URL shortener)",
                "Build: core feature working locally"
              ],
              [
                "7-8",
                "Binary search + heap/top-K (~8 problems)",
                "Deploy a rough version to a live URL"
              ],
              [
                "9-10",
                "Stack + the gentle DP slice (~6 problems)",
                "Write the README, add basic tests"
              ],
              [
                "11-12",
                "Mixed-set recognition drill (random patterns)",
                "Polish; draft the 3 portfolio-to-interview stories"
              ],
              [
                "13-14",
                "Two full mock rounds, timed, out loud",
                "Final deploy; rehearse the design walkthrough of your own project"
              ]
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "target",
            text: "Score the only metric that matters here: **recognition speed.** On a fresh problem, can you name the pattern in under 60 seconds? Track ‘named it cold’ vs ‘had to flail.’ When your recognition rate climbs past ~80% on a mixed set, you’re *done* drilling - that’s the boundary. Stop and go interview. (Threshold is my calibration; the discipline is: pick a number and let it tell you when to stop.)"
          },
          {
            type: "callout",
            tone: "warning",
            icon: "chat",
            text: "Always practice *out loud.* The single biggest gap between people who solve at their desk and people who pass: silent solvers freeze when they have to narrate. Rubber-duck every rep, or use Module 4’s mock partner. The interview tests thinking-out-loud, so rehearse thinking out loud."
          }
        ],
        oneLiner: "Drill recognition, not volume - and let your hit-rate tell you when to stop."
      },
      {
        n: "08",
        eyebrow: "The long game",
        title: "Edge cases, ethics, and the rust you’re afraid of",
        lead: "Before the assignment, the questions you’re actually carrying - the gap years, the AI tools, the ‘am I too old/rusty for this’ fear. The ones a generic prep guide skips, and the ones that quietly cost people their nerve.",
        blocks: [
          {
            type: "decode",
            items: [
              {
                worry: "‘I’ve been out of coding for a year settling in Canada.’",
                signal: "Rust is real but shallow - two weeks of pattern drilling restores far more than you expect, because you’re re-indexing, not relearning. The portfolio project doubles as your re-warm-up. Name the gap as ‘relocating + upskilling,’ same as Module 2."
              },
              {
                worry: "‘Can I use AI / Copilot to build the portfolio?’",
                signal: "To *build*, yes - that’s modern engineering, and using tools well is a plus. But you must be able to explain and defend every line in an interview. Never ship code you can’t walk through. The honesty line: AI is a collaborator, not a ghostwriter for skills you don’t have."
              },
              {
                worry: "‘They gave me a take-home - is it a scam / free labour?’",
                signal: "A *scoped* take-home (3-4 hours, a toy problem) is normal and fair here. A ‘build our actual feature’ task that smells like unpaid production work is a red flag - it’s fine to ask the scope and decline politely. Senior candidates can negotiate a live session instead."
              },
              {
                worry: "‘I’m senior - isn’t LeetCode beneath me / insulting?’",
                signal: "It can feel that way, and at some shops it genuinely is mis-calibrated. But treat the coding round as a *format* to pass, not a referendum on your worth. Pass it with grace, then let the design and review rounds - where seniority shows - do the real talking."
              }
            ]
          },
          {
            type: "callout",
            tone: "warning",
            icon: "close",
            text: "The ethics line, hard and non-negotiable: **never have someone else interview for you, and never claim a project or skill you can’t defend live.** Proxy interviewing and faked portfolios get discovered - in the very next round, the reference check, or the first week on the job - and they end careers, not just candidacies. Everything in this module makes you *genuinely* sharper. Keep it genuine; that’s also what survives scrutiny."
          },
          {
            type: "h",
            text: "Common mistakes that waste good engineers’ months"
          },
          {
            type: "ul",
            items: [
              "Grinding 300 random problems instead of drilling 8 patterns to recognition - motion mistaken for progress.",
              "Practicing silently, then freezing the moment you have to narrate in the real round.",
              "Prepping for Google’s bar to interview at companies that don’t test it - over-studying the wrong test.",
              "Building a sprawling portfolio that’s never deployed - ambition with no clickable proof.",
              "Neglecting the design and code-review rounds, where your actual seniority is your biggest edge.",
              "Treating the coding round as an insult and showing it - letting wounded pride cost you the offer."
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "spark",
            text: "The reframe to keep: you are not a junior cramming CS for the first time. You’re a senior engineer *re-indexing* skills you already own and pointing them at a known, finite test. That’s a far smaller, far more winnable job than the mountain your anxiety drew - and you’ve done harder engineering than this for years."
          }
        ],
        oneLiner: "You’re not relearning the craft. You’re aiming it at a test that finally has edges."
      }
    ],
    assignment: {
      title: "Your Week-5 sharpening plan + portfolio brief",
      intro: "You finish this module holding two tangible artifacts: a two-week prep plan scoped to *your* target loop, and a one-page brief for a portfolio project you can start this week. Not a reading list - a build plan. Here’s a worked example to copy from.",
      steps: [
        {
          lead: "Profile your target loop.",
          text: "List 5 real companies you’re targeting. For each, note the likely loop (coding bar: standard vs FAANG-hard? design round? take-home?). This tells you how hard to push the algorithm column - don’t prep for a test you won’t be given."
        },
        {
          lead: "Fill your two-week plan.",
          text: "Copy the Day 1-14 table from Section 7 into your own sheet. Assign the 8 patterns across the coding column and your portfolio milestones across the design column. Block the hours in your calendar - unblocked prep doesn’t happen."
        },
        {
          lead: "Write the portfolio brief.",
          text: "Complete the one-page brief below: the Canadian problem, the dataset, the stack, the *one* core feature for v1, and the deploy target. Scope it to ship in 2-3 weeks. One feature, live - that’s v1."
        },
        {
          lead: "Pre-draft your three bridges.",
          text: "Before you build, name the three interview assets the project will hand you (a STAR debugging story, a design walkthrough, a code-review sample). Knowing them up front makes you build the project that fuels all three."
        }
      ],
      blocks: [
        {
          type: "h",
          text: "Your portfolio brief - a worked example (yours will differ)"
        },
        {
          type: "table",
          note: "A real, shippable example. The point is the *shape*: one local problem, real data, one core feature, a live URL. Swap in your own problem and stack.",
          cols: [
            "Field",
            "Worked example"
          ],
          rows: [
            [
              "Canadian problem",
              "‘Is my bus actually late?’ - a TTC/GO real-time delay tracker for one route"
            ],
            [
              "Real dataset",
              "Open transit GTFS-RT feed (City of Toronto / Metrolinx open data)"
            ],
            [
              "Stack",
              "React + TypeScript · Node/Express API · PostgreSQL · deployed on Render/Fly"
            ],
            [
              "v1 core feature (only one)",
              "Enter a route → see live delay vs schedule. No accounts, no maps yet."
            ],
            [
              "Deploy target",
              "A live, clickable URL in the README - done in week 2, not someday"
            ],
            [
              "The 3 interview bridges",
              "STAR: ‘debugging the messy GTFS feed.’ Design: ‘how I’d scale this to all routes.’ Review: ‘my clean PR history.’"
            ]
          ]
        },
        {
          type: "h",
          text: "Your target-loop profile - the worked example"
        },
        {
          type: "table",
          note: "Profiling your real targets stops you over- or under-preparing. Most non-FAANG loops need the 8 patterns at standard depth; flag the ones that need more.",
          cols: [
            "Company (target)",
            "Coding bar",
            "Other rounds",
            "So I’ll…"
          ],
          rows: [
            [
              "40-person Toronto fintech",
              "Standard (the 8 patterns)",
              "Design + code review",
              "Drill recognition, polish design & PRs"
            ],
            [
              "Mid-size SaaS scale-up",
              "Standard + light DP",
              "Take-home + design",
              "Add the DP slice, scope take-home tightly"
            ],
            [
              "Shopify / big-tech Canada",
              "Hard (advanced graphs/DP)",
              "Multiple coding + design",
              "Double the coding weeks; start earliest"
            ]
          ]
        },
        {
          type: "callout",
          tone: "insight",
          icon: "rocket",
          text: "When this brief is filled and the two-week plan is on your calendar, you’ve converted ‘I should study technical stuff’ - a fog that breeds dread - into a bounded, scheduled, finite project with a clickable artifact at the end. That conversion, from infinite fear to finite plan, *is* the deliverable. Now go build the small thing."
        }
      ]
    }
  },

  {
    id: "module-6",
    n: "06",
    of: "06",
    track: "Land the offer",
    locked: false,
    title: "Negotiate, sign, and land well",
    subtitle: "An offer email is not the finish line - it’s the start of the one conversation in this whole search where *you* hold the leverage. Here’s how to read the comp, ask for more without flinching, and survive the first 90 days so the offer you fought for actually sticks.",
    meta: [
      "~32 min read",
      "1 comp sheet + 1 negotiation script + 1 90-day plan",
      "the only stage where leverage is finally yours"
    ],
    build: "You’ll leave holding three artifacts: a **Comp Comparison Sheet** that turns competing offers into one apples-to-apples number, a **word-for-word negotiation script** built around your real situation, and a **30-60-90 plan** you bring to day one - so you negotiate from data, not gratitude, and land instead of getting quietly managed out.",
    sections: [
      {
        n: "01",
        eyebrow: "Clear the noise",
        title: "The four things that talk you out of your own leverage",
        lead: "The offer finally lands, and a quiet voice tells you to just sign before they change their mind. That voice is the most expensive one in your whole search. Let’s name what it’s really saying, grant each its grain of truth, then notice they all point the same way - toward leaving money and standing on the table.",
        blocks: [
          {
            type: "lies",
            items: [
              {
                claim: "I’m a newcomer - I can’t be picky.",
                grain: "Your alternatives really are thinner than a local with ten years of references, and that’s real leverage they have and you don’t.",
                trap: "But ‘can’t be picky’ is not the same as ‘can’t ask.’ They already chose you over everyone else - that decision is *made* and it’s expensive to redo. Asking professionally has almost never un-made it. We’ll script exactly how."
              },
              {
                claim: "If I negotiate, they’ll pull the offer.",
                grain: "It happens - at tiny, unprofessional shops, or if you’re rude or wildly off-market.",
                trap: "At a real company a rescinded offer over one polite, market-grounded counter is so rare it’s a story people tell *because* it’s rare. The recruiter expects a counter; many have a band they’re pre-authorized to move within."
              },
              {
                claim: "The number they offered is *the* number.",
                grain: "It’s a real number, written down, that feels final.",
                trap: "It’s an *opening* number, often the bottom of a band the recruiter is allowed to flex. Treating the first figure as the last is the single most common way newcomers leave $10-20k on the table on day zero."
              },
              {
                claim: "Once I sign, the hard part is over.",
                grain: "The search is over - that part is true, and you should feel it.",
                trap: "The riskiest 90 days of the whole job start the day you sign. More newcomers lose the role in the probation window than ever get an offer rescinded. The finale isn’t the signature; it’s landing."
              }
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "spark",
            text: "Notice the shape - Module 1’s Locus Tax, one last time. Every one of those points away from the two things you fully control: **the number you ask for, and how you show up in the first 90 days.** This entire search you’ve been the one being filtered. For one short window - between ‘we’d like to make you an offer’ and your signature - the leverage flips to you. Don’t spend it apologizing."
          },
          {
            type: "figure",
            figure: {
              kind: "locusFlip",
              external: [
                "Whether they liked you (decided already)",
                "The size of the band",
                "What a local would be offered",
                "The market this quarter"
              ],
              controllable: [
                "The number you counter with",
                "Asking before you sign",
                "Getting it in writing",
                "How you land the first 90 days"
              ],
              leftLabel: "Already settled - stop fighting it",
              rightLabel: "Still yours to move",
              leftIcon: "close",
              rightIcon: "check"
            },
            caption: "The decision to hire you is made. Everything on the right is still open - and it’s where the money and the longevity live."
          }
        ],
        oneLiner: "‘I can’t be picky’ is not ‘I can’t ask.’ They already chose you - that part is done."
      },
      {
        n: "02",
        eyebrow: "The machine",
        title: "What actually happens between ‘offer’ and ‘onboarding’",
        lead: "It feels like the offer is a single yes/no moment. It isn’t - it’s a short, scripted process with three people who each have a different job. Knowing who’s who is most of the leverage.",
        blocks: [
          {
            type: "ul",
            items: [
              {
                lead: "The verbal offer lands first.",
                text: "Usually a recruiter calls with a number before anything is in writing. This call is a *trial balloon*, not a contract - its whole purpose is to gauge your reaction. ‘Yes, absolutely, thank you!’ on this call is the most expensive sentence in your search. The right answer is warm, grateful, and non-committal: ‘That’s exciting - thank you. Can you send the full details in writing so I can review the whole package?’"
              },
              {
                lead: "The recruiter is your negotiator, not your adversary.",
                text: "Their job is to close you at a number that fits the band. They’re measured on filling the seat - a collapsed deal is a loss for them too. Treat them as the person carrying your message to the hiring manager, because that’s exactly what they are."
              },
              {
                lead: "The hiring manager owns the band.",
                text: "The recruiter usually has a pre-approved range; going above it means the manager (or finance) has to sign off. This is why a *specific, justified* number works - you’re handing the recruiter the argument they’ll use upstairs on your behalf."
              },
              {
                lead: "The written offer is where it gets real.",
                text: "Base, bonus, equity, start date, sometimes a sign-on. Nothing counts until it’s in this document. ‘We’ll take care of you at review’ is not a number; it’s a feeling. Get it in writing or it doesn’t exist."
              },
              {
                lead: "Then the clock starts.",
                text: "You sign, you start, and a probation period (commonly 3 months in Canada, sometimes 6) begins - a window where the bar to let you go is much lower. The offer was the door. The first 90 days is whether you get to stay in the room."
              }
            ]
          },
          {
            type: "callout",
            tone: "quote",
            icon: "quote",
            text: "Here’s what the recruiter says to the hiring manager after the trial-balloon call, and you never hear it: ‘They sounded happy but didn’t commit - I think there’s room, want me to come up 8k to lock it?’ Or, the other version: ‘They bit my hand off, we’re good at the number.’ Your reaction on that first call literally writes one of those two sentences. Pick which one."
          },
          {
            type: "figure",
            figure: {
              kind: "threeGates",
              prefix: "Stage",
              gates: [
                {
                  name: "Verbal offer",
                  icon: "chat",
                  symptom: "The trial balloon - react warm but non-committal, get it in writing"
                },
                {
                  name: "Written offer",
                  icon: "doc",
                  symptom: "The real document - read every component before you respond"
                },
                {
                  name: "The counter",
                  icon: "bolt",
                  symptom: "One specific, market-grounded ask - the recruiter carries it upstairs"
                },
                {
                  name: "First 90 days",
                  icon: "rocket",
                  symptom: "Probation - the lowest-bar window to lose the role you just won"
                }
              ]
            },
            caption: "Four stages, not one signature. Most newcomers collapse all four into a panicked ‘yes’ on stage one and lose leverage at every step after."
          }
        ],
        oneLiner: "‘Yes, absolutely, thank you!’ on the first call is the most expensive sentence in your search."
      },
      {
        n: "03",
        eyebrow: "The framework",
        title: "Read the whole package - base is only the headline",
        lead: "A Canadian tech offer is five or six moving parts, and recruiters quote the one that sounds biggest. Two offers with the same base can be $25k apart once you total them. Before you can negotiate or compare anything, you have to be able to read every line.",
        blocks: [
          {
            type: "h",
            text: "The components of a Canadian comp package"
          },
          {
            type: "ul",
            items: [
              {
                lead: "Base salary.",
                text: "Your guaranteed annual cash, paid every pay period. The most important number because it’s certain, it’s what raises and pensions are calculated from, and it’s the hardest for them to claw back. When two offers compete, base is the anchor - everything else is a probability."
              },
              {
                lead: "Bonus (target %, not guaranteed).",
                text: "Quoted as a percentage of base - ‘10% target bonus’ means 10% *if* targets are hit, often a blend of company and personal performance. Treat it as ‘likely but not certain,’ and ask the question newcomers skip: ‘What did this bonus actually pay out, on average, the last two years?’ A 15% target that paid 4% last year is not 15%."
              },
              {
                lead: "Equity - RSUs (public) or options (startup).",
                text: "At public companies you usually get RSUs: a dollar grant that vests over ~4 years (commonly 25%/year, sometimes a slower or back-loaded schedule - read it). At startups you get *options* - the right to buy shares at a set price; potentially huge, potentially worth zero, and you may owe tax to exercise. Public RSUs ≈ delayed cash; startup options ≈ a lottery ticket. Never value them the same way."
              },
              {
                lead: "Benefits & health.",
                text: "Extended health/dental/vision on top of provincial coverage, plus life and disability insurance. Real money - a solid family health plan is worth several thousand a year you’d otherwise pay out of pocket. Newcomers under-weight this badly because back home it was often the state’s job."
              },
              {
                lead: "RRSP / pension match.",
                text: "The closest thing to free money in the offer. A common shape: the employer matches your RRSP contribution up to 3-5% of base. If you contribute 4% and they match 4% on a $130k base, that’s ~$5,200/year of guaranteed extra comp - but only if you opt in. Many newcomers leave it unclaimed for a year because nobody explained it. (RRSP = the Canadian tax-advantaged retirement account; the match is employer money on top of salary.)"
              },
              {
                lead: "Sign-on bonus & one-offs.",
                text: "A one-time cash lump (sometimes to offset a bonus you’re forfeiting by leaving, or relocation). Easiest thing for a recruiter to add when base is capped - which makes it a useful *fallback ask*. Often has a clawback if you leave within 12 months; read that clause."
              }
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "badge",
            text: "The move that separates people who negotiate well: **stop comparing base, start comparing total.** Add base + *expected* bonus (use the real payout history, not target) + annualized RSU value + RRSP match + a rough dollar value for benefits. That single number - call it your **True Total** - is the only honest way to weigh one offer against another, or to know if a ‘lower’ base is actually higher."
          },
          {
            type: "figure",
            figure: {
              kind: "impactFormula",
              parts: [
                {
                  label: "Base",
                  hint: "guaranteed cash"
                },
                {
                  label: "+ Expected bonus",
                  hint: "actual payout %, not target",
                  accent: true
                },
                {
                  label: "+ RSU / yr",
                  hint: "grant ÷ vest years"
                },
                {
                  label: "+ RRSP match",
                  hint: "free employer $"
                },
                {
                  label: "+ Benefits",
                  hint: "~$ value/yr"
                }
              ]
            },
            caption: "Your True Total. Recruiters quote whichever single chip sounds biggest; you quote the sum. Tune each input to the real document in front of you."
          }
        ],
        oneLiner: "They’ll sell you the headline. You do the addition."
      },
      {
        n: "04",
        eyebrow: "The deep-dive",
        title: "Real numbers - benchmarks by city, role & level",
        lead: "You can’t ask for a number you don’t have, and ‘I think I deserve more’ is not a number. Here are directional benchmarks to anchor on - then exactly how to sharpen them into the one figure you’ll say out loud.",
        blocks: [
          {
            type: "callout",
            tone: "warning",
            icon: "globe",
            text: "Read this before the table. These are **directional benchmarks - my calibration from offers I’ve seen and made, not a salary survey.** Comp moves with the market, the company tier, and your exact stack. Use them to get in the right *region* and to sanity-check a lowball, then replace them with live data using the three free sources below. Never quote my numbers in a negotiation - quote *your* researched range."
          },
          {
            type: "table",
            title: "Base salary, total-comp range - senior software engineer (CAD)",
            note: "Directional only, 2025-ish, for a strong senior IC at a mid-to-large tech employer. Ranges widen at the top because big-tech and US-remote pull the ceiling up hard. Levels below assume the same city (Toronto) to isolate the level effect.",
            cols: [
              "City",
              "Base (typical)",
              "Total comp (with bonus + equity)"
            ],
            rows: [
              [
                "Toronto / Waterloo",
                "$120k - $160k",
                "$140k - $210k+"
              ],
              [
                "Vancouver",
                "$115k - $155k",
                "$135k - $200k+"
              ],
              [
                "Montreal",
                "$105k - $140k",
                "$120k - $180k"
              ],
              [
                "Calgary / Ottawa",
                "$110k - $145k",
                "$125k - $185k"
              ],
              [
                "Remote (CAD co.)",
                "$115k - $155k",
                "$135k - $200k"
              ],
              [
                "Remote (US co., paid CAD)",
                "$150k - $200k+",
                "$190k - $300k+"
              ]
            ]
          },
          {
            type: "table",
            title: "The level effect - same city, same role family (Toronto, CAD base)",
            note: "Title inflation back home is exactly why Module 2 had you calibrate level to *scope*. Negotiate the level you actually operate at, with the scope bullets to prove it - a level bump is worth more than any single-year raise.",
            cols: [
              "Level",
              "Base (typical)",
              "What it assumes"
            ],
            rows: [
              [
                "Intermediate (3-5 yrs)",
                "$95k - $120k",
                "Ships features independently"
              ],
              [
                "Senior (5-9 yrs)",
                "$120k - $160k",
                "Owns systems, mentors, sets technical direction"
              ],
              [
                "Staff (9+ yrs)",
                "$160k - $210k+",
                "Org-level impact, cross-team leadership"
              ]
            ]
          },
          {
            type: "h",
            text: "Turn benchmarks into YOUR number - three live sources, free"
          },
          {
            type: "ul",
            items: [
              {
                lead: "levels.fyi - the closest thing to ground truth.",
                text: "Real total-comp data points (base/equity/bonus) by company, level, and increasingly by city. Filter to Canadian offices. Best single source for big-tech and the upper end."
              },
              {
                lead: "Glassdoor + Indeed - breadth, not precision.",
                text: "Wider coverage of mid-market and non-famous employers where levels.fyi is thin. Treat any single number as noisy; look at the range and the median, not one post."
              },
              {
                lead: "A recruiter, asked directly.",
                text: "Agency recruiters know live bands because placing people *is* their job. ‘For a senior backend role in Toronto right now, what base range are you seeing?’ - most will tell you, because a well-calibrated candidate is easier for them to place."
              }
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "target",
            text: "Now compress your research into one sentence you can say without flinching: **‘Based on levels.fyi and two recruiter conversations, senior backend roles in Toronto are landing at $135-155k base; given my scope I’m targeting the upper half of that.’** That’s not arrogance - it’s a calibrated engineer citing data. It’s the exact opposite of ‘I think I deserve more,’ and it changes how the recruiter argues for you upstairs."
          }
        ],
        oneLiner: "‘I deserve more’ is a feeling. ‘$135-155k, per the data’ is a negotiation."
      },
      {
        n: "05",
        eyebrow: "The script",
        title: "The negotiation, word for word - including the ‘can’t be picky’ trap",
        lead: "This is the section to screenshot. A negotiation is four short beats, and the words matter because the wrong ones leak the desperation that invites a lowball. Here’s exactly what to say - and the one trap that costs newcomers the most.",
        blocks: [
          {
            type: "figure",
            figure: {
              kind: "weeklyLoop",
              steps: [
                {
                  label: "Get it in writing",
                  icon: "doc"
                },
                {
                  label: "Express real enthusiasm",
                  icon: "spark"
                },
                {
                  label: "Make ONE specific ask",
                  icon: "target"
                },
                {
                  label: "Anchor it in data",
                  icon: "globe"
                },
                {
                  label: "Then go quiet",
                  icon: "check"
                }
              ]
            },
            caption: "The four-beat counter (plus the hardest beat: silence). One specific, justified number - then stop talking and let it land."
          },
          {
            type: "h",
            text: "Beat 1 - On the verbal call, don’t negotiate. Just receive it."
          },
          {
            type: "callout",
            tone: "quote",
            icon: "chat",
            text: "‘Thank you so much - I’m genuinely excited about this team. Could you put the full details in writing so I can review the whole package? Then I’ll come back to you quickly.’  → You’ve shown enthusiasm (recruiters need that), committed to nothing, and bought time to think. You never negotiate live on the surprise call."
          },
          {
            type: "h",
            text: "Beat 2 - The counter, in one message"
          },
          {
            type: "p",
            text: "Once it’s in writing, you respond - email is fine and often better, because the recruiter can forward your exact words upstairs. The structure: *gratitude → enthusiasm → one specific number → the data behind it → a reason you’re worth it → an easy yes.*"
          },
          {
            type: "callout",
            tone: "quote",
            icon: "quote",
            text: "‘Thanks again for the offer - I’ve read it in full and I’m very keen to join. The base of $130k is a little below what I’m seeing for this scope: my research and a couple of recruiter conversations put senior backend roles in Toronto around $140-150k. Given I’d be coming in owning the payments platform from day one, could we get the base to $145k? If we can land there, I’m ready to sign this week.’  → One number. A reason. A data anchor. A clear close. Then you stop typing."
          },
          {
            type: "h",
            text: "Beat 3 - Then go silent (the hardest part)"
          },
          {
            type: "p",
            text: "You made the ask; now let it sit. The instinct to soften it - ‘…but of course I understand if that’s not possible, $130k is also totally fine!’ - is the single most expensive reflex in negotiation. You just negotiated against yourself before they said a word. Send the ask. Close the laptop. Let the silence do the work."
          },
          {
            type: "callout",
            tone: "warning",
            icon: "bolt",
            text: "The ‘I can’t be picky’ trap, named so you can catch yourself doing it. It sounds like: pre-apologizing (‘I know I’m new here, so…’), naming your own weakness (‘I don’t have Canadian experience yet, but…’), or collapsing the instant they pause. Every one of these hands the recruiter a discount you volunteered. **You are not asking for a favour. You are a calibrated professional citing market data for a role they already decided they want you in.** Say the number. Don’t decorate it with your anxieties."
          },
          {
            type: "h",
            text: "Beat 4 - If base won’t move, move the asks"
          },
          {
            type: "p",
            text: "Sometimes base is genuinely capped by a band or a level. That’s not a dead end - it’s a redirect. Base is the prize, but it’s rarely the only lever, and a ‘no’ on base is often a ‘yes’ on something else:"
          },
          {
            type: "figure",
            figure: {
              kind: "channelBars",
              bars: [
                {
                  label: "Base salary",
                  value: 100,
                  tone: "hot",
                  note: "the prize - compounding, certain, raise-anchoring"
                },
                {
                  label: "Sign-on bonus",
                  value: 70,
                  tone: "warm",
                  note: "easiest yes when base is band-capped"
                },
                {
                  label: "More equity / RSUs",
                  value: 55,
                  tone: "warm",
                  note: "if you believe in the company"
                },
                {
                  label: "Level / title bump",
                  value: 85,
                  tone: "hot",
                  note: "moves base AND every future raise"
                },
                {
                  label: "Start date / extra PTO",
                  value: 40,
                  tone: "cold",
                  note: "low-cost goodwill asks"
                }
              ]
            },
            caption: "When base is stuck, pivot to the next lever down - ‘If $145k base isn’t possible, could we bridge with a $10k sign-on?’ Bar heights are the relative value of winning each, my calibration."
          },
          {
            type: "callout",
            tone: "insight",
            icon: "check",
            text: "And the honesty line, because it protects you: **never invent a competing offer you don’t have.** A fabricated ‘I have another offer at $160k’ collapses the instant they call your bluff (‘great, send it over and we’ll match’), and the recruiter community is small. You don’t need a fake offer - you have real market data, which is sturdier *because* it’s true. If you genuinely have a competing offer, absolutely use it: ‘I’m weighing another offer at $X, but you’re my first choice - can you get close?’"
          }
        ],
        oneLiner: "Say the number. Then stop talking - the silence is doing your negotiating."
      },
      {
        n: "06",
        eyebrow: "Decode the phrase",
        title: "What the recruiter’s words on the offer call actually mean",
        lead: "Offer-stage language is its own dialect - designed to sound final when it’s often flexible, or generous when it’s deferring. Decode the common ones and you’ll know when there’s room and when there genuinely isn’t.",
        blocks: [
          {
            type: "decode",
            items: [
              {
                worry: "“This is a very competitive offer.”",
                signal: "A framing move, not a fact - it primes you to accept. It doesn’t mean ‘final.’ The correct response isn’t to argue the adjective; it’s to come back with your specific, data-anchored number anyway. Competitive offers can still move."
              },
              {
                worry: "“This is the top of the band for this level.”",
                signal: "Often true - and the real tell that your lever is the *level*, not the number. Pivot: ‘Understood. Given I’d own X scope, is there a case for bringing me in at the next level?’ A level bump beats arguing cents inside a capped band."
              },
              {
                worry: "“We don’t really negotiate / everyone starts here.”",
                signal: "Sometimes a true policy (some firms have rigid bands), often a test of whether you’ll fold. Stay warm and ask once more for something non-base - sign-on, start date, an early review. If it’s genuinely fixed, you’ll lose nothing by having asked politely."
              },
              {
                worry: "“We’ll make it right at your first review.”",
                signal: "A promise with no number and no date - treat it as zero until it’s in writing. Counter: ‘I’d love that - could we note a review at 6 months with a specific target in the offer letter?’ A vague future raise is not compensation."
              },
              {
                worry: "“What are your salary expectations?” (asked early)",
                signal: "Don’t name a number first if you can avoid it - deflect to range and to them: ‘I’m focused on fit; what’s the band you’ve set for this role?’ If pressed, give your *researched range*, anchored at the top, never a single low figure you’ll be held to."
              }
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "doc",
            text: "The meta-rule under all of these: **the person who names a hard number first usually loses a little.** Stay in ranges, keep anchoring on data, and make them commit the figure to writing. Polite, specific, and patient beats eager every time - and eager is the exact tell that gets newcomers a lowball."
          }
        ],
        oneLiner: "‘Competitive’ describes how they want you to feel, not whether there’s room."
      },
      {
        n: "07",
        eyebrow: "Run it like an engineer",
        title: "The first 90 days - a plan so you don’t get managed out",
        lead: "You signed. Now the riskiest part begins, and almost nobody plans for it. Probation isn’t a formality - it’s the window where the bar to let you go is lowest, and where a new hire from a different work culture is easiest to misread. So you run it the way you ran the search: instrumented, deliberate, one loop at a time.",
        blocks: [
          {
            type: "p",
            text: "The brutal truth nobody tells newcomers: in the first 90 days you are rarely judged on your *code*. You’re judged on whether you’re easy to work with, whether you communicate proactively, and whether you’re visibly becoming independent. Strong engineers from other cultures get managed out not for skill, but for going quiet, over-promising, or waiting to be told what to do when the local norm is to ask. The fix is a plan."
          },
          {
            type: "figure",
            figure: {
              kind: "weeklyLoop",
              steps: [
                {
                  label: "Days 1-30: Learn & connect",
                  icon: "map"
                },
                {
                  label: "Days 31-60: Contribute",
                  icon: "code"
                },
                {
                  label: "Days 61-90: Own",
                  icon: "rocket"
                },
                {
                  label: "Weekly: 1:1 + written update",
                  icon: "chat"
                }
              ]
            },
            caption: "The 30-60-90 arc, with one weekly heartbeat running underneath it. Learn, then contribute, then own - visibly, in writing, every week."
          },
          {
            type: "signals",
            items: [
              {
                n: "1",
                name: "Days 1-30 - Learn the system and the people, loudly",
                what: "Ship something tiny and real in week one (a doc fix, a small bug, your dev env working). Map who owns what. Set up recurring 1:1s. Ask a lot of questions - and write down the answers so you only ask once.",
                why: "Early questions read as engaged here, not weak - Module 4’s culture point applies. A first-week merged PR, however small, tells the team ‘this hire moves.’ Going silent to look competent is the classic newcomer mistake; it reads as stuck.",
                fix: "End week one with: one merged PR, a working environment, your manager’s expectations written down, and three teammates you’ve actually talked to.",
                before: "Quietly reading code for three weeks, afraid to ask ‘obvious’ questions, nothing shipped.",
                after: "A merged typo-fix on day 3, a list of ‘who to ask about X,’ and a 1:1 where you asked ‘what does great look like at 90 days?’"
              },
              {
                n: "2",
                name: "Days 31-60 - Contribute on the main work, predictably",
                what: "Take real tickets. Deliver them when you said you would. Communicate *before* you’re blocked, not after. Start giving back in code review.",
                why: "Predictability is the trait probation actually measures. A mid-size feature delivered on a date you set, with a heads-up the moment it slipped, builds more trust than a brilliant thing delivered late and silently. Over-promising to impress is how good engineers fail probation.",
                fix: "Pick deadlines you can beat, then communicate proactively: ‘On track for Thursday’ / ‘hit a snag, now Friday, here’s the plan.’ Reliability over heroics.",
                before: "Took a big task to prove yourself, went heads-down, missed the date, surfaced it only when asked.",
                after: "Took a right-sized task, posted a short midpoint update, shipped on time, flagged the one risk early."
              },
              {
                n: "3",
                name: "Days 61-90 - Own something and ask for the read",
                what: "Own a small area end to end. Then explicitly ask your manager for feedback before the formal probation review - don’t wait to be surprised by it.",
                why: "Owning something is the signal you’ve crossed from ‘onboarding cost’ to ‘net contributor.’ And asking ‘how am I tracking against what you expected at 90 days?’ surfaces any concern while there’s still time to fix it - instead of hearing it for the first time in a probation-fail meeting.",
                fix: "By day 75, book the conversation yourself: ‘I want to make sure I’m meeting your expectations - where am I doing well, and where should I focus?’",
                before: "Assumed silence meant things were fine; blindsided at the 90-day review.",
                after: "A 75-day check-in that turned one vague worry into a concrete focus area you closed before the formal review."
              }
            ]
          },
          {
            type: "callout",
            tone: "quote",
            icon: "quote",
            text: "What gets said in the room when a manager keeps a probationer: ‘Honestly? Their code was average for the level, but they’re completely reliable, they flag problems early, and the team likes working with them. Easy keep.’ Almost never ‘their algorithms were brilliant.’ Reliable and easy-to-work-with beats brilliant-and-quiet, every single time in the first 90 days."
          }
        ],
        oneLiner: "In the first 90 days they don’t keep the best coder. They keep the one they trust."
      },
      {
        n: "08",
        eyebrow: "The long game",
        title: "Low offers, competing offers, exploding deadlines, and the parts that aren’t the number",
        lead: "Before the assignment, the edge cases that decide real outcomes - the situations a generic guide skips and a newcomer actually faces. None has a heroic answer; each has a sane one.",
        blocks: [
          {
            type: "decode",
            items: [
              {
                worry: "The offer is genuinely below market - do I take it just to get in?",
                signal: "Separate two questions: is the *base* below market, and is the *role* a real step up in legitimacy? A first Canadian job that’s 10% light but gives you local experience, a reference, and PR-friendly stability can be worth it as a 12-18-month bridge - taken with eyes open. A job that’s 30% light *and* a step down is usually a trap dressed as a foot in the door. Counter first regardless; you may be surprised."
              },
              {
                worry: "An ‘exploding offer’ - ‘we need your answer by tomorrow.’",
                signal: "Real deadlines exist; 24-hour ultimatums on a life decision are usually pressure tactics. Respond warm and firm: ‘I’m very excited and want to give this the serious decision it deserves - could I have until [a few days out]?’ A company that yanks an offer for asking for a weekend told you something useful about working there."
              },
              {
                worry: "I have a competing offer (or a current job) - how do I use it without bluffing?",
                signal: "Use it honestly and it’s your strongest lever: ‘I have another offer at $X, but your team is my first choice - if you can get close, I’ll sign with you today.’ Real, specific, and gives them a clear win. Never fabricate one; the ask to ‘send it over’ ends the bluff and your credibility."
              },
              {
                worry: "I already said yes too fast / accepted verbally. Can I still negotiate?",
                signal: "Before signing, yes - carefully. ‘I’m still completely on board. Reviewing the written details, I noticed the base is under market for the scope; would there be room to revisit before I sign?’ Harder than negotiating cleanly up front, but a verbal yes is not a signature. After signing, let it go and earn it at review."
              },
              {
                worry: "Work permit / PR status complicates everything.",
                signal: "Your immigration status is a real constraint, not a reason to accept anything. If you need sponsorship or have a closed permit, name it early and factually - it narrows your options but doesn’t erase your leverage on the offers you do get. Don’t let ‘they’d have to do paperwork’ talk you out of asking for fair pay."
              }
            ]
          },
          {
            type: "callout",
            tone: "warning",
            icon: "spark",
            text: "On taking the low first offer: there’s no shame in a bridge job, and I won’t pretend otherwise - many strong careers here started with one. The danger isn’t taking it; it’s *forgetting it’s a bridge.* If you accept under market to get your footing, write yourself a note: re-enter the market in 12-18 months, now with Canadian experience and a local reference, and run this whole module again from a position of real strength. The second offer is where the discount gets repaid."
          },
          {
            type: "h",
            text: "Common mistakes that cost the most"
          },
          {
            type: "ul",
            items: [
              "Accepting the verbal number on the spot - negotiating against yourself before the written offer even arrives.",
              "Comparing offers on base alone and missing a $20k gap hiding in bonus, equity, and RRSP match.",
              "Softening the ask in the same breath you make it (‘…but $130k is fine too!’).",
              "Treating ‘we’ll sort it at review’ as a number instead of getting it in writing.",
              "Inventing a competing offer - a bluff that collapses the moment they say ‘send it over.’",
              "Signing, then going quiet for 90 days to look self-sufficient - and getting read as stuck.",
              "Leaving the RRSP match unclaimed for a year because nobody explained it was free money."
            ]
          },
          {
            type: "callout",
            tone: "insight",
            icon: "rocket",
            text: "And the close, because this is the last page of the whole playbook: you did the hard thing. You decoded the machine, rebuilt the document, earned the warm intro, learned to interview here, sharpened the right tech - and now you’ve negotiated and landed like someone who belongs, because you do. The ‘newcomer’ frame had an expiry date. This was it. Go sign it."
          }
        ],
        oneLiner: "There’s no shame in a bridge job - only in forgetting it was a bridge."
      }
    ],
    assignment: {
      title: "Your offer toolkit - comp sheet, script, and 90-day plan",
      intro: "Don’t walk into the offer talk improvising. Build these three artifacts now - before any offer lands - so when the call comes you’re reading from a plan, not your nerves. You finish holding a filled comp sheet, a script with your real numbers in it, and a 30-60-90 you can hand your manager on day one.",
      steps: [
        {
          lead: "Pull your real benchmark range.",
          text: "For your exact role + level + city, get three data points (levels.fyi, Glassdoor/Indeed, one recruiter). Write the one sentence: ‘Roles like mine are landing at $___-___ base; I’m targeting the upper half.’"
        },
        {
          lead: "Fill the Comp Comparison Sheet.",
          text: "Enter every offer (real or hypothetical for practice) and compute its True Total - base + expected bonus (real payout %, not target) + annualized RSU + RRSP match + a benefits estimate. The biggest base is often not the biggest True Total."
        },
        {
          lead: "Write your counter script, with your numbers in it.",
          text: "Fill the template below with your actual target number and data anchor. Read it aloud until it sounds like a calm professional, not an apology. Delete every softener (‘just’, ‘maybe’, ‘if that’s okay’, ‘but I understand’)."
        },
        {
          lead: "Draft your 30-60-90.",
          text: "Three short bullet lists - Learn / Contribute / Own - with one concrete week-one win you can ship. You’ll refine it once you know the team, but you bring the skeleton to day one."
        }
      ],
      blocks: [
        {
          type: "h",
          text: "Your Comp Comparison Sheet - a worked example (yours will differ)"
        },
        {
          type: "table",
          note: "Two offers, same surprise: Offer B’s lower base is the higher True Total once the RRSP match, real bonus, and benefits are counted. Base alone would have pointed you the wrong way. Numbers are illustrative - fill yours from the real documents.",
          cols: [
            "Component",
            "Offer A (Toronto)",
            "Offer B (remote, CAD co.)"
          ],
          rows: [
            [
              "Base",
              "$140,000",
              "$132,000"
            ],
            [
              "Bonus (target → real payout)",
              "12% → ~$11,200 (paid ~8%)",
              "10% → ~$13,200 (paid ~10%)"
            ],
            [
              "RSUs (grant ÷ 4 yrs)",
              "$60k ÷ 4 = $15,000/yr",
              "$40k ÷ 4 = $10,000/yr"
            ],
            [
              "RRSP match",
              "3% = $4,200",
              "5% = $6,600"
            ],
            [
              "Benefits (est. value)",
              "~$3,000",
              "~$5,500"
            ],
            [
              "True Total",
              "≈ $173,400",
              "≈ $167,300"
            ],
            [
              "Verdict",
              "Higher total + onsite network",
              "Lower total, but remote + better match/benefits"
            ]
          ]
        },
        {
          type: "h",
          text: "Your counter script - fill in the brackets"
        },
        {
          type: "callout",
          tone: "quote",
          icon: "chat",
          text: "‘Thanks again for the offer - I’ve read it in full and I’m genuinely excited to join [team]. The base of [their number] is a little under what I’m seeing for this scope: my research and a couple of recruiter conversations put [role] in [city] around [your researched range]. Given I’d be [the specific scope/ownership you bring] from day one, could we get the base to [your one number]? If we can land there, I’m ready to sign this week.’"
        },
        {
          type: "ul",
          items: [
            {
              lead: "If they say base is capped:",
              text: "‘Completely understand. If $[X] base isn’t possible, could we bridge the gap with a $[Y] sign-on, or look at the next level given the scope?’"
            },
            {
              lead: "Then stop typing.",
              text: "No softener. No ‘but it’s fine either way.’ Send it and wait."
            }
          ]
        },
        {
          type: "h",
          text: "Your 30-60-90 skeleton - a worked example"
        },
        {
          type: "table",
          note: "Bring this to day one; refine it after your first 1:1. The point isn’t to predict the work - it’s to show up with a deliberate arc instead of waiting to be told what to do.",
          cols: [
            "Phase",
            "Goal",
            "One concrete action"
          ],
          rows: [
            [
              "Days 1-30",
              "Learn & connect; ship something tiny",
              "Merge one small PR in week one; book recurring 1:1s; write down ‘what great looks like at 90 days’"
            ],
            [
              "Days 31-60",
              "Contribute predictably on main work",
              "Own a mid-size ticket; post a midpoint update; start reviewing teammates’ PRs"
            ],
            [
              "Days 61-90",
              "Own an area; ask for the read early",
              "Own one small component end-to-end; at day 75, ask ‘how am I tracking vs. your expectations?’"
            ]
          ]
        },
        {
          type: "callout",
          tone: "insight",
          icon: "check",
          text: "When all three artifacts are filled - a True Total per offer, a script with your real numbers and zero softeners, and a 30-60-90 with a week-one win - you’re done. Not just with this module. With the playbook. You walked in wondering why your applications vanished; you’re walking out negotiating an offer and planning how to land it. That’s the whole arc. Go get it in writing."
        }
      ]
    }
  },
];

function getModule(id) { return MODULES_DATA.find((m) => m.id === id); }

/* Single unlock plug point. Today Modules 1 & 2 are open (locked:false) and 3-6
   are teasers. When real payment is wired, flip this to read a purchase token /
   localStorage / server flag - no component changes needed. */
function isUnlocked(/* moduleId */) { return false; }

Object.assign(window, { MODULES_DATA, getModule, isUnlocked });
