---
name: job-seeker-resume-pipeline
description: "Run or audit the Job Seeker project resume pipeline (tailoring, ATS simulation, cover letters, JD scoring) for Rob Blake's MarOps / Marketing Analytics job search. Trigger when Rob says 'run the resume pipeline on this JD', 'tailor my resume', 'score this job', 'is this role a fit', or attaches a JD and asks for a tailored resume or cover letter. ALSO trigger when Rob has recruiter DMs, comp-screening questions, or an interview scheduled and needs pitch prep, recruiter-screen scripts, or follow-up emails. ALWAYS preflight the JD against the active strategy (Seniority/Specialist-pass pivot, salary floor, remote-US, Marketo-primary, lead-with-craft) BEFORE tailoring. Source of truth: C:\\Users\\Rob\\Business_Projects\\Project_1_Job_Seeker\\ (Windows) and /root/Business_Projects/Project_1_Job_Seeker/ (VPS mirror)."
---

# Job Seeker Resume Pipeline

Rob's active job-seeker project targets **remote-US, Manager/Senior IC, $75K+ floor (recently pivoted down from $100K+), Marketo-primary, MarTech/RevOps/GTM-Engineer roles**. The project has 100+ hours of investment: a master resume, locked `resume_template.py` (DOCX generator with navy/Calibri styling), a 10-stage tailoring workflow, an ATS simulator, a daily-scout cron, a batch-tailor pipeline, per-job scoring JSONs, cover-letter templates, and 2,300+ files. Do not rebuild from scratch — the project's own files are the source of truth.

## Source-of-truth paths

| What | Windows path | VPS mirror |
|---|---|---|
| Project root | `C:\Users\Rob\Business_Projects\Project_1_Job_Seeker\` | `/root/Business_Projects/Project_1_Job_Seeker/` |
| Master resume | `data/master-resume.md` | same |
| Locked DOCX template | `scripts/resume_template.py` | same |
| Tailor script | `scripts/resume_tailor.py` | same |
| Pipeline skill docs | `scripts/skills/{resume-tailoring-workflow,cover-letter-template,linkedin-ats-simulation}.md` | same |
| Per-job scoring JSONs | `data/resume_content/*.json` (e.g. `Lattice_GTM-AI-Engineer.json`) | same |
| Tailored applications | `data/applications/<YYYY-MM-DD>_<title>_resume.docx` | same |
| Cowork spec | `specs/Rob_Blake_Cowork_Project_Spec.md` | same |
| Session handoffs | `Session Handoffs/session-handoff-YYYY-MM-DD-V*.md` | same |
| Latest handoff (as of writing) | `Session Handoffs/session-handoff-2026-07-10-V2.md` | same |
| **RRR sibling project (NOT resume work)** | `C:\Users\Rob\Business_Projects\Project_3_Real_Results_Front_Desk\` | `/root/Business_Projects/Project_3_Real_Results_Front_Desk/` (writable location: `/root/.hermes/Business_Projects/Project_3_Real_Results_Front_Desk/`) |
| **RRR condensed punch list (VPS-side mirror of 7/13 handoff)** | — | `/root/.hermes/Business_Projects/Project_3_Real_Results_Front_Desk/Project_3_Real_Results_Front_Desk/RRR_PUNCH_LIST_2026-07-14.md` |

If the project isn't on the VPS yet, follow the `windows-to-vps-file-transfer` skill to push it. If Rob references the project but the path doesn't exist anywhere, the project may be stranded on the local install — see the `verifying-user-claims` recovery protocol.

### VPS writability trap + delivery — read before saving outputs

**`/root/Business_Projects/Project_1_Job_Seeker/` is a read-only bind mount on this VPS.** You cannot write new files there — `doc.save()` / `write_file()` / `cp` will fail with `OSError: [Errno 30] Read-only file system`. The Windows path (`C:\Users\Rob\Business_Projects\Project_1_Job_Seeker\`) is the real source of truth and is writable.

**Default delivery path (2026-07-23 update): the Obsidian vault, not the outbox.** The outbox at `/root/.hermes/outbox/` is writeable but **not synced** to Connie — files saved there sit invisible until manually pulled with `scp`, which is exactly the kind of thing that wastes Rob's time. The Obsidian vault at `/root/.hermes/vault/` is the user's curated-notes folder and **is** synced both ways via Syncthing (folder ID `hermes-vault`, paired with Connie device `34F6KTU`). Anything dropped in the vault appears on Connie's `C:\Users\Rob\Documents\Obsidian Vault\` automatically.

**Tailored-application delivery pattern (use this every time):**

1. **Build the DOCX** by running the locked template or the per-job JSON generator. Save to `/root/.hermes/vault/01_Job_Seeker/Rob_Blake_Resume_<Company>_<JobTitle>.docx`. The naming convention matches the existing entries in that folder (e.g. `Rob_Blake_Resume_Judge-Group_Marketing-Solution-Architect.docx`).
2. **Write a companion memo note** at `/root/.hermes/vault/01_Job_Seeker/<Company>-<JobTitle>-Tailoring-<YYYY-MM-DD>.md` with: company, title, comp, remote status, URL, preflight verdict, ATS score, frame-mismatch notes, manual copy step, and the open question (cover letter? tracker row? etc.). Use YAML frontmatter so it's searchable in Obsidian. This is the "distilled note" Rob's curation rules require.
3. **Optional: also save to `/root/.hermes/outbox/`** if Rob wants a wget-able URL or to feed some other downstream tool. Otherwise skip — the vault is the single delivery point.
4. **Tell Rob the file is in the vault** and offer the manual copy step if he wants the DOCX to also live in `C:\Users\Rob\Business_Projects\Project_1_Job_Seeker\data\applications\` (the project tree where the tracker and adjacent scripts read from):
   ```powershell
   Copy-Item 'C:\Users\Rob\Documents\Obsidian Vault\01_Job_Seeker\Rob_Blake_Resume_<Company>_<JobTitle>.docx' 'C:\Users\Rob\Business_Projects\Project_1_Job_Seeker\data\applications\'
   ```
   This step is **not optional** if the application needs to participate in the tracker; the project tree on Windows is the source of truth for the application's metadata. Vault is the curated human-readable copy; project tree is the pipeline-readable copy.
5. **Wipe `/root/.hermes/staging/` after Rob confirms the vault sync** — staging holds the per-job JSON, scoring JSON, JD text, and generator script for the most recent run. They serve as audit trail but don't need to live forever on the VPS. On Rob's confirmation, run `rm -rf /root/.hermes/staging/job*_<latest>/` to free disk. The vault memo note already captures the tailoring context for the rest of history.
6. **Do not pretend the project dir was written.** Do not skip the manual-copy instruction. Do not save to `/root/.hermes/outbox/` as the primary destination anymore — the vault is the right place.

This pattern replaces the previous outbox-only workflow. The previous outbox habit (2026-05 through 2026-07-23) caused Rob to hit "I can't see the file on Connie" — the outbox was never synced. Use the vault. Project_3 (RRR) DOES have a proper writable VPS mirror at `/root/.hermes/Business_Projects/Project_3_Real_Results_Front_Desk/` — Project_1 doesn't, which is why the vault delivery pattern is the canonical workaround. If the `python-docx` import fails when building the resume, `python3 -m pip install python-docx` from the Hermes venv fixes it.

### Why the vault and not the outbox (one-line recap)

Outbox is writeable but never synced to Connie. Vault is writeable AND synced both ways via Syncthing. Vault is the canonical delivery path for any tailoring output that Rob needs to see. Use the vault.

## Preflight gate — ALWAYS run before tailoring

Before generating a single bullet, run this checklist against the JD. If it fails, stop and tell Rob, don't tailor.

| Check | Threshold | Source of truth |
|---|---|---|
| Work arrangement | Remote-US only. Reject hybrid-3-day or office-required. | README + spec |
| Salary floor | $75K+ base. Below floor → flag for discussion, don't auto-tailor. Undisclosed comp → flag as `PASS-WITH-FLAGS`, do NOT block — comp is a screening-call question, not an application blocker, when everything else passes. | 2026-07-10 V2 handoff (down from $100K+) |
| Seniority | Senior IC, Specialist, Senior Specialist, Senior Analyst, Manager. Reject Director/VP-track unless Rob explicitly overrides. | 2026-07-10 V2 handoff |
| Industry | B2B/SaaS preferred; healthcare, fintech, enterprise software OK; B2C, public sector, agencies stretch | spec, README |
| Primary tool match | Marketo OR Salesforce OR HubSpot (expert OR listed as required) | master resume `data/master-resume.md` |
| Frame fit | "Marketo expert, currently independent consulting, want the craft not the management ladder" | 2026-07-10 V2 handoff |

**Frame check is the one most often missed.** The current pivot has TWO distinct dimensions, and the preflight check covers both:

1. **Title/scope frame** — "Marketo expert, currently independent consulting, want the craft not the management ladder." If a JD wants "10+ years architecting enterprise MarTech with executive presence and BI/eng partnership" (e.g. Global Payments MSA), that is **off-strategy** under the current pivot. Surface the mismatch to Rob, ask before tailoring.
2. **Operational frame** — the role's *posture* toward leadership. A JD can pass the title/scope frame (Sr. Manager, MarOps, Marketo/SFDC named) but fail the operational frame if it wants "strategic thought partner / analytical counterpart to Marketing leadership" with no hands-on Marketo craft in the bullets. Example: Pantheon Sr. Manager RevOps - Marketing (2026-07-23) — the JD is all channel-mix / territory / quota-coverage / BDR-capacity / funnel-leakage work, with zero Marketo execution. Master content can support the resume, but the subtitle, summary, and bullets must reframe around "analytical counterpart and funnel owner," not "Marketo craft." Flag this as a second dimension of the frame check.

The pipeline can produce a tailored resume for both, but the application is likely to waste a slot unless one of the override paths below applies.

**Output of the preflight gate:** one-line verdict — `PASS`, `PASS-WITH-FLAGS: <list>`, or `BLOCK: <reason>`. Do not proceed past BLOCK without explicit Rob override.

### Explicit override path: architect-track contract roles

The preflight BLOCK is a strategy gate, not a prohibition. If Rob explicitly says to run an off-strategy role as a **rate/scope test**, a bridge contract, or a deliberate exception, accept the override and proceed without relitigating the Specialist-pass pivot. Record the reason in the run notes and change the verdict to `PASS-WITH-FLAGS`, not an unqualified PASS.

**Do not infer an override from the generic instruction “run the resume pipeline.”** That instruction authorizes the normal workflow, including its preflight stop; it does not waive the active strategy. For an architect-title contract that conflicts with the Specialist-pass frame, surface the specific block and ask for an explicit override before generating a new resume. A prior override for a similar or identically titled role does not carry forward automatically—the end client, rate, scope, and economics may differ.

For a recruiter-supplied W2 contract where the JD scope appears architect-level but the rate is materially lower:

1. Annualize the rate transparently: hourly rate × 2,080 hours. Example: $48/hr W2 = $99,840 gross annualized; $70/hr = $145,600; $90/hr = $187,200.
2. Explain the trade-off: W2 benefits, paid time off, holidays, and payroll-tax treatment have value, but do not silently treat them as making an architect-scope rate market-aligned.
3. Preserve both facts in the output: **technical fit may be strong while compensation/scope alignment is weak**.
4. Treat the application as a **rate-validation / scope-validation submission**, not as acceptance of the economics. Surface questions about the client ceiling, benefits/PTO, overtime, conversion potential, and whether the actual work is architect-level or implementation-level.
5. If the JD is truncated, tailor only to the text actually supplied. Do not invent missing requirements; label the result as partial-JD tailoring and list the unverified areas.

For this override class, use the architecture-contract reference: `references/architecture-contract-override.md`.

### Worked example: the TARGET-COMPANY-LEVEL override path (Stripe, 2026-07-23)

A fourth BLOCK-override pattern emerged that is *not* per-role. Rob stated he is **lifting the "strategist" level focus at Stripe specifically**, while keeping the Specialist-pass discipline for every other company. This is an explicit strategy exception scoped to one company, not a per-role verdict override.

When Rob says "lift the strategist level to apply to [Target Company]":

1. **Treat it as a company-level exception**, not a free pass. Apply it only to roles at that company, only for the session in which Rob stated it, and only when the user reaffirms. Other companies remain on the standard Specialist-pass gate.
2. **Run the duplicate guard and preflight normally.** The exception loosens the seniority scope frame, not the salary, remote, or comp floors. The user can still BLOCK for hybrid-on-site, undisclosed comp, or hard gaps the verified master cannot support.
3. **Concentrate, don't shotgun.** When the company is large (Stripe, Yipit, etc.), the surfaced job list can be 30–50+ roles. The right output is a ranked short list — top 1–3 to apply, 1–3 secondary stretches, and skip-lists for attractive titles whose hard requirements are outside the verified master. Real example (2026-07-23): Stripe search across 8 teams returned 41 US-remote roles; the honest ranked short list was Forward Deployed AI Accelerator, Marketing (fit 90) → Campaign Operations Manager (fit 86–92) → Enterprise Paid Digital Marketing Manager (fit 78), with PMM Growth as a deliberate stretch and 30+ other roles as skip.
4. **Use parallel subagents for sourcing scans.** When the user asks for a ranked short list across a company's job board, do not try to read every JD serially. Split the surface into 3 batches of JDs, dispatch a `delegate_task` leaf per batch, and synthesize. The synthesis step ranks by: strongest verified evidence → weakest honest hard gap → comp → growth/scope, in that order.
5. **The "real" gap is preferred qualifications, not minimums.** Read the JD's *required* section to decide if the verified master can support the role. Treat preferred qualifications as stretch goals; do not let a missing preferred qualification turn a real match into a skip.
6. **Snapshot the rank-list in the vault.** A multi-role scan belongs in `Stripe-US-Remote-Opportunity-Scan-<YYYY-MM-DD>.md` with the ranking table, the per-role strongest-match / hard-gap notes, and the recommended application order. Future sessions searching Stripe can read it instead of re-scanning.
7. **PMM-style strategist roles need a separate honesty pass.** Rob has built AI workflows and analytics, not product positioning/messaging portfolios. PMM roles at Stripe (or any company) can be submitted as a deliberate stretch, but the resume must not claim PMM craft the master doesn't support. Use the existing PMM Growth tailored resume as the template; it correctly preserves verified evidence and surfaces gaps.

### Worked example: the BLOCK path (Global Payments MSA, 2026-07-14)

The first real BLOCK fired on the Global Payments MSA JD. The preflight correctly flagged it as off-strategy (Director-track + executive-presence + BI/eng-partner ask vs the 7/10 "lead with Marketo craft" pivot). The correct sequence at BLOCK is:

1. **Surface the specific mismatches, not a generic "doesn't fit" verdict.** Quote the JD's specific asks and explain which strategy pivot they conflict with. The Global Payments JD asked for "10+ years architecting enterprise MarTech, executive presence, partnering with BI/eng/RevOps/SalesOps" — that is Director-track framing, the opposite of the active "lead with Marketo craft, not management ladder" pivot.
2. **Note the strategic tension, not just the technical mismatch.** The 7/10 pivot is recent (less than a week old when the Global Payments JD came in) and not always top-of-mind when Rob pastes a JD. Remind Rob the pivot exists and let them decide — don't assume they remember.
3. **Ask, don't auto-tailor.** Even when the pipeline could technically produce a tailored resume, the slot is more valuable spent on a strategy-fit role. Ask: "Off-strategy under the 7/10 pivot. Skip, or do you want to override?"
4. **If Rob confirms skip, file and move on.** Don't keep the JD in scope. Don't generate a "tailored for reference" version. Don't propose to update the strategy. The pivot stands; the JD is not pursued; pivot to whatever Rob was actually working on (often the next thing in their punch list).

Do NOT propose to "tune the resume" to make the off-strategy role fit, suggest Rob re-evaluate the 7/10 pivot in the same session, or shop for similar roles. The pipeline's job is to execute the current strategy, not to question it.

### Worked example: the BLOCK-override path (Macmillan Campaign Ops Specialist, 2026-07-15)

A second BLOCK pattern emerged that is structurally different from Global Payments. The Macmillan / Noor Staffing Group Campaign Operations Specialist JD failed preflight on two grounds: (1) rate $40-50/hr × 15-20 hrs/wk = ~$40-52K annualized, well below the $75K floor, and (2) it's a 6-month temp contract, not a full-time role. But Rob overrode with a coherent strategic reason: "part-time work could pair well with establishing RRR, more time to work that... and still bring in some steady income." The override is legitimate — the contract is a *bridge* to focused time on the higher-priority project, not a substitute for the FT search.

When the BLOCK is overridden with a structural-reason ("this pairs with X," "this bridges Y"):

1. **Accept the override cleanly, don't relitigate.** The preflight is a gate, not a tripwire. Once Rob states a reason that goes beyond "I just want to apply," proceed.
2. **Apply the 7/10 reframe at the application level even though the master is still V1.** The master reframe work (PMI Marketo story, dropping fabricated jobs) is pending and not blocking. Don't let a stale master sabotage a strategy-fit submission — tailor the bullets directly, and note in the deliverable that the master is still pre-reframe.
3. **Reorder the experience section to put the strongest JD-relevant role first.** For Macmillan, PMI was reordered above Trimble and Lumen because its global demand-gen + Workfront ticketing story is the strongest Marketo-execution-at-scale content available in the V1 master. The reframe will reorder properly; for an override-driven application, do the tactical reorder now.
4. **Budget the deliverable for the contract scope.** Don't generate a 5-year career-narrative cover letter. The cover letter can explicitly acknowledge the part-time/contract scope and the bridge-to-other-work rationale — Macmillan-style JDs (agency-staffed, short-term) appreciate the honesty and it reduces the "why would someone this senior take a 15-hr contract?" question before they ask it.
5. **The "salary anchor" rule flips.** For FT roles, the cover letter usually doesn't name a number unless Rob says so. For contract/temp roles, the JD often names the rate and the cover letter should explicitly align with it (or push back up). Macmillan: cover letter said "Rate: aligned with the $40-50/hr posted range depending on scope" — make it easy for the agency to say yes without a back-and-forth.

The BLOCK-override path is a successful one if the application goes out and doesn't burn a slot that could have gone to a strategy-fit FT role. After override, the natural next step in the session is usually: log the application to the tracker, surface the manual-copy-from-outbox step, and ask whether to pivot to whatever Rob's primary work actually is (typically the RRR punch list, per the "natural next step" note at the bottom of this skill).

### Worked example: the REFERRAL-override path (Pantheon Sr. Manager RevOps - Marketing, 2026-07-23)

A third BLOCK-override pattern emerged that is structurally different from both Global Payments and Macmillan. The Pantheon Systems Sr. Manager of RevOps - Marketing JD passed every literal preflight check (remote-US, $125-154K + bonus well above $75K floor, B2B SaaS, Sr. Manager band) but the **operational-frame warning** fired: the role is "strategic thought partner / analytical counterpart to Marketing leadership," not IC-craft Marketo execution. The JD has no Marketo mention (stack-agnostic) and 6 of 8 bullets describe funnel/territory/channel-mix/BDR-coverage thought partnership.

Rob overrode with one line: "an old colleague mentioned it to me." That changed the calculus — a referral reduces the application cost (internal submission, bypass of the portal) so the operational-frame mismatch becomes a soft constraint rather than a kill signal. The verdict was `PASS-WITH-FLAGS` and the resume was tailored to the role's actual posture (analytical counterpart, funnel ownership, tech stack as the foundation), not the 7/10 IC-craft pivot.

When the BLOCK is overridden on a **referral signal**:

1. **Trust the referral signal over the frame-fit signal.** A referral is application-cost insurance. The slot isn't wasted if the role is technically adjacent rather than strategy-fit — the colleague does the filtering.
2. **Tailor to the role's actual posture, not the active strategy pivot.** For Pantheon, the subtitle was "Senior Marketing Operations Manager | Funnel & Revenue Operations Strategy" — NOT "Consulting Marketo Architect." The resume must read like the hiring manager wrote the JD themselves when they read it.
3. **Pull the JD's exact language into the summary.** Pantheon used "strategic thought partner," "analytical counterpart," "pushing back on leadership with data while deferring to ownership," "structural fix," "root-cause analysis," "top-of-funnel yield." These phrases were reflected verbatim in the tailored summary — that's what a referral-resume looks like. The hiring manager sees their own language and the colleague's name lights up.
4. **Do NOT relax the no-fabrication rule.** The referral lowers the application cost, not the truth standard. Master content only — reword, reorder, reframe. A referral collapses a real weakness (frame mismatch) faster than a fabricated strength collapses a real interview.
5. **The "experience reframe" choice flips.** For Specialist-pass submissions, the experience section is ordered to lead with the strongest Marketo craft. For referral / Manager-as-thought-partner submissions, the experience section is reordered to lead with the role that most resembles the JD's posture (PMI's "embedded analytics partner to marketing leadership" typically wins over Trimble's Marketo execution).
6. **Skip the cover letter.** Referrals are the closer. A cover letter dilutes the referral signal. The submission is the resume + the colleague's name.
7. **Save the per-job scoring JSON with the referral reason explicit** in the `override_reason` field. Future sessions looking at the tracker need to see "referred by colleague, not a strategy-fit submission" so they don't pattern-match this as a green light on similar frame-fit-mismatched roles.

**Lesson:** the preflight gate is a strategy filter, not a demand curve. A referral, a known hiring manager relationship, or a recruiter who's already invested all lower the application cost enough to override a frame-fit warning. Don't extend that posture to cold applications — keep the frame-fit warning a hard gate when the application is unmediated.

### Worked example: the MASTER-STALENESS override path (Lumen Digital Experience Strategist, 2026-07-25)

A fifth BLOCK-override-adjacent pattern emerged that is structurally different from referral, contract, and Stripe. The first tailoring of the Lumen Digital Experience Strategist JD (2026-07-23) framed AEM, Adobe Target, 6sense, ContextHub, Targeted Content, and Optimizely as **fast ramp** or **familiar** in the cover letter — explicitly because the project's `data/master-resume.md` and `data/docs/rob-blake-tool-depth-map.md` did not contain that history. The depth map said AEM = `familiar` with the note "Enterprise CMS, some exposure," 6sense = `aware` ("Know the category, haven't used"), and the master had no Level 3 Communications entry at all. The cover letter was honest by the file's truth, but the file was stale.

When Rob supplied a "Robs Storyboard Outlines" doc with the Level 3 bullet material and a verification of his hands-on AEM work during the CenturyLink→Lumen rebrand, the right move was the **Master-staleness override path**: do not silently rewrite Rob's real history down to match the stale master. Recalibrate the depth map, add the missing employer to the master, re-tailor the resume, and rewrite the cover letter's gap paragraph as a calibrated depth disclosure ("Adobe Target originated at Level 3, AEM is familiar from the Lumen rebrand, 6sense is familiar from AI education, Optimizely is familiar").

When the master, depth map, and the user's claim disagree:

1. **Ask for the verification material first.** In Rob's case, the storyboard doc + his own bullet draft for Level 3 (with dates, employer, title, location) was the verification. Don't accept a vague "I have hands-on with X" — ask for the specific role, dates, what was owned, and where the documentation lives.
2. **Edit the depth map and the master in the same session.** The depth map is the working doc; the master is the long-form source. Edit the depth map first, then the master, then re-tailor. Do not skip the depth map — it is the file future sessions pattern-match against when sizing up a JD.
3. **Recalibrate the cover letter's gap paragraph to a depth disclosure.** "I am honest about the gap" → "I have hands-on with [X] from [Y] and [Z]; I am familiar with [A] and [B] for these reasons; here is how I ramp to daily ownership." The depth disclosure reads as confident and honest; the gap admission reads as defensive. The 2026-07-25 Lumen PARA_2 reframe is the canonical example (cover letter saved to vault; reference file documents the before/after). For the full pattern and a side-by-side comparison table, see `references/master-staleness-and-user-reported-history.md` § Depth disclosures, not gap admissions.
4. **Surface the upstream change to the user.** The project dir on the VPS is read-only; the depth map and master changes stage in `~/.hermes/staging/<job>_<date>/`. The vault memo must include a manual-copy step for the user to apply the staged `.md` files back to the project tree on Connie. Do not pretend the change propagated.
5. **Do not move past the upstream change without flagging the age risk.** Adding an older employer to a 10-year-curated master is a real signal-shift. Rob is 63 and the master is curated to "last 10 years" partly to avoid surfacing age. Before adding Level 3 (2011–2015), confirm the trade-off — in Rob's case, the telecom lineage and Adobe Target origin story outweighed the age-signal risk for the Lumen JD specifically. That is a per-JD decision, not a permanent change to the curation rule.

**Lesson:** the master resume and the depth map are point-in-time snapshots of Rob's history, not the history itself. The 7/23 Lumen tailoring was the right conservative default given the inputs, but the conservative default cost a real cover letter paragraph that should have led with the Adobe Target origin story. The 7/25 reframe is the right output given the new context. The override path is "verify upstream, edit the working docs, re-tailor, surface the staged changes" — never "silently demote the claim to match the file."

### Recruiter outreach with no compensation or contract terms

A recruiter initiating contact reduces application cost, but it does **not** waive the strategy preflight. When the DM contains a partial JD and says a role "can be remote" while omitting commercial terms:

1. Use `PASS-WITH-FLAGS` if the technical/frame fit is sound; do not invent the client, rate, duration, employment type, benefits, time zone, or onsite cadence.
2. Tailor only to the supplied text. Preserve weak or absent tools honestly (`familiar` stays familiar; unverified tools and certifications stay out).
3. Build the resume and a concise reply that asks for: client name, compensation/rate, W2/C2C/full-time status, duration, benefits, working hours/time zone, and confirmation that remote means remote from Colorado with no regular onsite requirement.
4. Do not authorize recruiter submission or create a tracker row as if submitted until those terms are known or Rob explicitly says to proceed.
5. **Sending is an external side effect.** Drafting a DM is not sending it. Only say "sent" after an authenticated messaging tool returns a verifiable success result. If no authenticated LinkedIn tool is available, save the draft in the vault, name the recruiter in the filename, identify the exact resume to attach, and state plainly that the send remains manual.

## The tailoring workflow (per `scripts/skills/resume-tailoring-workflow.md`)

1. **JD extraction + duplicate guard (BLOCKING)** — if a URL, extract the JD and durable identifiers: company, exact title, requisition/job ID, opportunity UUID, canonical URL, recruiter/client, and a 2–3 sentence distinctive phrase. Before preflight or generation, run these in parallel and treat any hit as BLOCKING until the prior artifact is verified and the user confirms the new JD is not the same requisition:
   - `search_files` for the company, job title, and the distinctive snippet across `/root/Business_Projects/Project_1_Job_Seeker/`, `/root/.hermes/vault/01_Job_Seeker/`, `/root/.hermes/outbox/`, and `/root/.hermes/staging/`.
   - `session_search` for the recruiter name, requisition/job ID, and the distinctive snippet, `role_filter='user,assistant,tool'`, `sort='newest'`.
   - `read_file` on the project tracker at `/root/Business_Projects/Project_1_Job_Seeker/data/Rob_Blake_Job_Search_Tracker_V2.xlsx` to check for an existing row keyed by company+title.
   - **Textual-duplicate check across recruiters/vendors.** A new DM that uses different recruiter or staffing language can still be the same client JD. If a 2–3 sentence snippet of the new JD is near-identical to a prior JD (same client intro, same bullet structure, near-identical phrasing), the new submission is almost certainly the same requisition. Surface the textual match to Rob before generating anything. **Real example (2026-07-23):** a separate recruiter reposted the Global Payments Marketing Solution Architect JD; near-identical text caught it before a duplicate tailored resume was sent. **Real example (2026-07-23):** Macmillan CAMPA003426 — the user pasted the same UltiPro URL twice in the same week; the project already had a tailored triplet from earlier. Stop and ask the user whether the new outreach is the same role or a genuinely new opportunity. Do not move on to preflight until the user has confirmed which it is.
   - **Attachment support is verification material.** If Rob attaches a storyboard, portfolio, references doc, prior resume, or JD screenshot in the same turn as a master-staleness or rewrite request, treat the attachment as authoritative for the facts in it. Don't ask Rob to re-paste the bullets or re-confirm the dates. Build the 4-column conflict table from the attachment + the master, then ask only the gaps the attachment didn't cover. See `references/master-staleness-and-user-reported-history.md` § Attachments as verification material.
2. **Fit assessment** — run the preflight gate above. **Stop here if BLOCK.** Confirm BOTH the title/scope frame AND the operational frame (see the Frame check note above). Operational-frame mismatch is a soft warning, not a hard block, when a referral or other application-cost-reduction signal is present.
3. **Tool depth mapping** — map JD tools against Rob's depth: the canonical source of truth is `data/docs/rob-blake-tool-depth-map.md` in the project. As of the 2026-07-25 Lumen reframe, the depth map's calibrated list includes: `expert` (Marketo, Salesforce, Adobe Analytics, Adobe Target, Demandbase, Google Analytics/GA4, Tableau, SOASTA/mPulse, BrightEdge, Semrush, Ahrefs, Screaming Frog, Google Optimize, Marketo Analytics, Google Ads, Bing Ads, Claude Code, n8n, Zapier, MCP, ChatGPT/GPT-4, Adobe Workfront, Slack), `proficient` (LinkedIn Ads, WordPress), `familiar` (HubSpot, Eloqua, ZoomInfo, Clay, Clearbit, 6sense, Optimizely, AEM, Sitecore, Drupal, Facebook Ads, Make.com, Monday.com, Jira, Confluence, Moz Pro, Conductor), `never touched` (omit entirely). The depth map is the working doc — when Rob updates his hands-on experience, edit the depth map first, then re-tailor.

   **Pitfall — master is not always complete.** The depth map and master resume are point-in-time snapshots, not a live ledger. Rob's actual career is longer than what's in either file. If Rob says "I have hands-on with X but the master doesn't show it," that's a signal to verify upstream, not to silently demote the claim to "familiar" or "fast ramp" in the tailored resume. The right move is the **Master-staleness override path** below. Silently rewriting the user's real history down to match a stale master loses interviews just as surely as overstating it costs them.
4. **ATS simulation** — derive **role-specific** cluster and direct-phrase files from the current JD, then run the bundled scorer. The script's bundled defaults are a regression scaffold shaped around a prior RevOps role; they are not valid evidence for unrelated roles such as campaign management or business analysis. Use single-token concepts in clusters and multi-word language in the phrase list. Score < 55 → stop and discuss. 55-74 → note gaps, proceed (one revision round usually clears legitimate MED gaps). ≥75 → strong. Never add an unverified tool, certification, platform, or domain claim merely to raise the score; intentional gaps should remain visible in the report.
5. **Gap analysis** — HIGH (cluster < 50, add to Core Competencies), MED (50-70, add bullet), LOW (70+, polish only). Two rounds to fix HIGH + MED is normal.
6. **Summary rewrite** — 4-5 sentences. Current headline identity + 1-2 signature achievements mapped to JD + specific tools + closing fit line. Pull the JD's exact phrases in where honest — they light up the hiring manager on first read.
7. **Core Competencies rewrite** — 5-7 lines max. Name tools at correct depth level. For referral / Manager-as-thought-partner roles, restore "Adobe Workfront" in the tech stack competency if the locked master dropped it — it's a JD phrasing tell.
8. **Experience bullets review** — DO NOT rewrite strong, JD-relevant bullets. Only add for uncovered gaps. Reorder jobs so the strongest JD-relevant role comes first (PMI beats Trimble for funnel/analytical-counterpart roles; Trimble beats PMI for Marketo-execution roles). **Pitfall — ask the user about job order before reordering.** The default of "strongest JD-relevant first" is wrong for a user who reads resumes in strict reverse-chronological order. The 2026-07-25 Lumen reframe started with Lumen first (insider-anchor), passed layout QA, and then the user asked for reverse-chronological — the whole resume had to be re-rendered. Ask once: "Do you want standard reverse-chronological (newest first), insider-anchor-first, or JD-relevance-first?" The cost of asking is one turn; the cost of re-rendering twice is a full layout-QA cycle + ATS re-run. See `references/master-staleness-and-user-reported-history.md` § Job order — ask before you reorder.
9. **Generate DOCX** — write a per-job JSON tailored to the JD, then render with `scripts/build_resume_from_json.py`. Save the primary output directly to `/root/.hermes/vault/01_Job_Seeker/Rob_Blake_Resume_<Company>_<Title>.docx`; the outbox is optional only. **Before using the renderer after any update, run a smoke test that asserts a 4-part header (`Title | Company | Location | Dates`) renders the date on the role line and the location on the company line.** Verify DOCX readback and paragraph count before declaring success.
10. **Rendered layout QA — mandatory** — convert the final DOCX to PDF, confirm the page count, render every page to images, and visually inspect all pages. Fix and rerender if you see clipping, overlap, orphaned role/company headings, near-empty spill pages, broken title/date placement, or unreadable density. A successful `doc.save()` is not layout verification. Keep each section heading with the following paragraph and each role line with its company line and first bullet. If conversion needs a writable LibreOffice profile on a read-only-home host, use a writable `HOME`/`XDG_CACHE_HOME`/`XDG_CONFIG_HOME` plus `-env:UserInstallation=file://<writable-path>`; treat this as the conversion setup, not as evidence that rendering is unavailable. **Pitfall — merging bullets is a false fix for spill orphans.** When a single bullet spills onto the next page, merging it into the previous bullet usually still fails: the merged bullet wraps to two lines and pushes over anyway (SOVRA 2026-07-31 cost two wasted render cycles). The working fix is to *shorten* the role's content — compress the bullet to a single line, or drop the role's weakest bullet — then rerender. Budget one shortening round, not one merge round.
11. **Cover letter (optional, NOT for referrals)** — only if Rob asks. 3 paragraphs max. Role + company why → one signature achievement → CTA. Reference salary range if discussed. **For referral submissions, skip the cover letter — the colleague's name is the closer.** **B2G / public-sector-customer angle (SOVRA 2026-07-31):** when the employer's customers are government agencies (GovTech, public procurement, defense-adjacent), Rob's Army Special Forces (18D) service is a deliberate differentiator — he has explicitly directed leveraging it. Place it three times with distinct jobs: (1) resume summary (trust/transparency fluency), (2) resume MILITARY section (visible, not buried), (3) a dedicated cover-letter paragraph tying public service to *why AI adoption stalls in trust-sensitive environments* — governance, standards, credible outputs — not as decoration. The military paragraph must do strategic work or it reads as padding.
11. **Tools-experience brief (common for contract/agency JDs)** — agency-staffed and short-term contract JDs (Noor Staffing, Robert Half, Insight Global, etc.) frequently ask you to "submit your resume along with a brief overview of your experience with [primary tool], [secondary tool], and [PM tool]." Build this as a separate one-page DOCX alongside the cover letter. Structure: 4-5 short sections — (1) Hands-on experience with primary tool with specific craft bullets (program templates, tokens, smart campaigns, etc.), (2) Most relevant roles mapped to the JD, (3) PM tool familiarity with a "fast ramp" framing for tools in the JD's preferred-but-not-required list (bridge to a tool you DO have — Workfront → Asana, Marketo → HubSpot), (4) AI/automation angle if the JD asks for it, (5) Availability + rate. This brief is often what the agency uses to pitch you to the client — make it skimmable.

## Hard rules — what the tailor MUST NOT do

- **Never fabricate experience.** The locked master resume is the source. Reword, reorder, re-emphasize — but do not invent employers, titles, dates, tools, or metrics. **If the user reports the master is missing real history, the fix is upstream (rebuild the master + depth map), not at the tailoring step.** Don't write a new employer bullet into a per-job JSON as a workaround — that bakes the fabrication into the application and any later audit will see a job that isn't in the master. See **Master-staleness override path** below.
- **Never drop a job from the master to "fit on one page."** Compress, not delete.
- **Never claim `expert` for a tool that's actually `familiar`.** Per the depth framework in `scripts/skills/resume-tailoring-workflow.md` Stage 3. The same rule applies in reverse: don't downgrade a `expert` claim to `familiar` or `fast ramp` just because the depth map hasn't been updated. If the user asserts a deeper history than the map shows, route through the master-staleness path.
- **Never recommend applying to an off-strategy role without flagging it.** The preflight gate is a gate, not a suggestion.
- **Never paste the master resume, generated resume, or cover letter in chat if it contains PII** (home address, phone, personal email). Path is fine, full text in chat is the GHL-token-burn pattern. Drop PII at the local level before pushing to the VPS if Rob hasn't already.

## Active strategy caveats — the 7/10 Specialist-pass pivot

Per `Session Handoffs/session-handoff-2026-07-10-V2.md`, the active strategy is a **deliberate down-level pivot** away from Director-track framing. Three things this means in practice:

1. **Lead with Marketo craft, not management scope.** The professional summary should emphasize Marketo + Salesforce + AI builder, not "team of 4" or "managed stakeholders." PMI and Lumen stories lead with the Marketo + Workfront + global shared services craft, not the management scope.
2. **Drop or downplay Director-track competencies** in Core Competencies (e.g. leadership, stakeholder management as primary). The frame is IC/consultant seeking craft, not ladder climber.
3. **Pipeline Layer title framing** is "Independent Marketing Operations Consultant" or "Consulting Marketo Architect" — NOT "Founder & AI GTM Automation Builder."

**Outstanding reframe work** (from V2 handoff, still pending as of 2026-07-14): master resume is missing the strongest Specialist-pass content (PMI Marketo + Workfront + 4-person team, Trimble + Lumen Wrike story), Pipeline Layer start date is ambiguous (Jul 2025 vs Mar 2026), 2–3 jobs in per-job JSONs are LLM fabrications and need to be dropped. 8 context questions block the reframe — if Rob hasn't answered them yet, do not re-ask in a way that suggests starting from scratch. Reference the handoff and ask "have you had time to look at the 8 questions yet?" rather than re-listing them.

## What this skill covers and does NOT cover

- **Interview prep** — now covered in `references/interview-prep-and-interviewer-intel.md` (briefs, pitch differentiation, recruiter motivators, comp screens, follow-up emails). Previously listed as NOT covered — that's been corrected.
- **Job discovery / sourcing** — see `scripts/daily_scout.py` and the `daily_match_notification` task in the Cowork spec
- **Application tracker maintenance** — separate workflow, lives in a Google Sheet referenced from the handoffs
- **Salary research / negotiation** — `scripts/salary_offers.py` + Task 3.1
- **LinkedIn profile reframe** — the LinkedIn side is intentionally manual (Rob pastes, login is irreversible); see handoff for pending reframe work

## Bundled scripts (active tailoring path)

These two scripts are the active day-to-day path. Drop them into a session and you can run the entire pipeline from a tailored JSON to a scored DOCX.

- **`scripts/build_resume_from_json.py`** — JSON-in → DOCX-out. Reads a per-job JSON (the same shape used by every `data/resume_content/*.json` in the project), renders a styled DOCX with the locked navy/Calibri look, and saves to `/root/.hermes/outbox/`. This is the active generator path; the legacy `scripts/resume_generator.py` and `scripts/resume_template.py` (JOBS tuples) are still in the tree but not in use. Verified against the Pantheon Sr. Manager RevOps tailoring (2026-07-23): renders 55 paragraphs, 40,622 bytes, identical layout to the TonyRole / SmartAsset submissions.
- **`scripts/ats_check.py`** — Cluster + direct-phrase ATS scorer. Reads the generated DOCX, scores it against the JD's keyword cluster (8 clusters covering funnel/CRM/BI/AI/conversion/cross-functional/seniority/data-narrative), and reports direct-phrase match. Decision band: <55 BLOCK, 55-74 PROCEED (one revision round typical), ≥75 STRONG. Run after generation to validate the tailoring actually hit the JD's language. Verified against the Pantheon Sr. Manager RevOps tailoring: 74.0% cluster / 88% phrase.

Run pattern:
```bash
python scripts/build_resume_from_json.py --json /root/.hermes/staging/<job>/<Company>_<Title>.json
python scripts/ats_check.py --resume /root/.hermes/outbox/Rob_Blake_Resume_<Company>_<Title>.docx
```

## Recruiter DM comp-screening replies — a recurring workflow this skill now covers

Rob's outreach pattern produces comp-screening DMs weeks after the application. Recruiters often reply with a transparent comp ask like: *"We are budgeting a total annual comp package of X-Y. The bonus is included in that range. Does that align with your needs and expectations?"* When Rob pastes one of these and asks for a reply draft, do this — do NOT skip to drafting blind:

1. **Decode the comp framing.** "Total annual comp, bonus included" ≠ "base + bonus on top." A $80–100K total range with a typical 10–15% target bonus implies base of roughly $70–90K — which is often BELOW the $75K+ base floor the strategy targets, even when the total number looks fine. Show the math table.
2. **Reconcile against the resume she's holding.** The resume Rob sent (often a V1 / pre-reframe version) frequently has a different seniority subtitle than the JD scope. Example from 2026-07-16 (Capacity): resume subtitle = "Senior Marketing Operations Manager," JD title = "Marketing Operations Manager." The recruiter's comp anchor is calibrated to the JD scope, not Rob's resume frame — which is part of why the number comes in low. Flag this as a "frame mismatch" so Rob sees why the comp is under his market.
3. **Compute Rob's realistic market anchor.** For a Senior MarOps Manager with Marketo + SFDC expert + AI workflow build + 10 yrs, realistic base is $115–130K (~$130–150K total comp). Anything materially below that is the recruiter anchoring low.
4. **Offer 3 reply postures** (Rob picks, never pick for him):
   - **Recommended — honest anchor-up:** acknowledge it's below range, signal you won't take bottom, leave door open if there's flexibility, propose screening call. No number named.
   - **Alt A — softer / accept-and-explore:** "is the range flexible or the hard ceiling?" — lowest risk, may lock in low comp.
   - **Alt B — hard anchor with number:** name a specific range, accept the risk that it kills the conversation. Cleanest if she has flexibility.
5. **Always close with a screening-call CTA** so the next step is concrete, not vague.
6. **After Rob confirms the draft, update the Job_Tracker_V2.xlsx row** — flip Status from "To Apply" / "Sent Resume via DM" to "Recruiter Screen - Pending" with a date stamp and a one-line note about the comp screen. Schema and example row in `references/recruiter-comp-screening-replies.md`.

**Reference:** `references/recruiter-comp-screening-replies.md` — full worked example (Capacity / Courtney Sovich, 2026-07-16), math decoder, three reply drafts, Job_Tracker schema, what to say when the reply doesn't mention comp at all.

## Related

- `verifying-user-claims` — when Rob references "the project" and it's not on the VPS yet
- `windows-to-vps-file-transfer` — pushing the project tree to the VPS for the pipeline to read
- `scripts/skills/resume-tailoring-workflow.md` — the locked 10-stage workflow this skill wraps
- `scripts/skills/linkedin-ats-simulation.md` — the ATS scoring rubric
- `Session Handoffs/session-handoff-2026-07-10-V2.md` — the most recent strategy handoff (as of writing); always check for a newer V* before tailoring
- `data/master-resume.md` — the master resume; read it before tailoring anything
- `references/resume-output-qa-and-recruiter-outreach.md` — role-specific ATS construction, truth assertions, DOCX header smoke test, PDF/image layout QA, and the distinction between drafting versus actually sending a recruiter DM
- `references/duplicate-requisition-and-sourcing-scan-playbook.md` — five-minute blocking duplicate-guard protocol, recruiter-DM duplicate pattern, company-level sourcing-scan workflow, and the 2026-07-23 Stripe scan worked example
- `references/master-staleness-and-user-reported-history.md` — when Rob reports the master resume or depth map is missing real history: the 4-column conflict table, three options (master-first / per-job JSON only / verify first), the depth-disclosure language pattern, the curation-conflict protocol, the attachments-as-verification pattern, the job-order pitfall, the cert-framing pitfall (don't over-disclose "lapsed" certifications for senior operators), the honest-call pitfall (don't append "honest call before you submit" disclaimers after the user accepts the work), and the 2026-07-25 Lumen worked example (resolved).
- `references/interview-prep-and-interviewer-intel.md` — when an interview is scheduled for a tailored role: build the brief from the submitted artifacts (staging JSON + cover letter + tailoring memo), classify the interviewer via web_search (LinkedIn URLs block extraction), recruiter-screen vs HM vs practitioner prep weighting, the HARD RULE to confirm Rob's real why-left story before scripting it (2026-07-31: brief scripted "restructuring," he actually left Lumen by choice for a +$35K Trimble raise), boomerang-candidate framing, recruiter-screen comp pattern (name the posted band back), public-source org intel reconstruction (label inferred), inbound HM-DM reply pattern (resume attached, cover letter skipped, concrete windows, conflict-checked), and ex-coworker intel outreach etiquette (2–4 DMs, intel not sponsorship, don't re-refer once in process).
- **When a JD is BLOCKed and Rob skips, the natural next thing is usually the RRR punch list at `/root/Business_Projects/Project_3_Real_Results_Front_Desk/Project_3_Real_Results_Front_Desk/RRR_PUNCH_LIST_2026-07-14.md`** — that's Rob's primary active work per memory, and the punch list is the open thread from a 7/13 session. Don't try to remember the RRR context; the punch list has it.
- **When Rob asks for a sourced ranked short list across a company's job board (e.g. "scan this Stripe search for roles that fit me"),** do not shotgun-tailor everything. The correct output is a single `Stripe-US-Remote-Opportunity-Scan-<YYYY-MM-DD>.md` memo in the vault with a ranked table, per-role notes, and an explicit apply/consider/skip verdict for each. The memo is the source of truth for future sessions; the user picks the top 1–3 and only then runs the tailoring pipeline on those. Don't generate 5+ tailored DOCXs "to be ready" unless Rob asks.
