# Mode: job — Full A-G Evaluation When the candidate pastes a job (text or URL), ALWAYS deliver the 7 blocks (A-F evaluation + G legitimacy): ## Liveness gate (URL inputs) When the candidate pastes a **URL** (not JD text), confirm the posting is still live before doing any evaluation. A dead link must never reach Block A — a 404/expired page wastes a full A-G evaluation, report, and PDF on phantom content. 1. Get the page content: if you arrived here from `auto-pipeline` (its Step 0.5 already navigated and cleared the link), reuse that snapshot — do not navigate again. On a direct URL entry, navigate with Playwright (`browser_navigate` + `browser_snapshot`) and read the title, URL, and visible content. 2. Classify the posting: - **active posting evidence:** title/role + a real job description or an application/apply path - **closed posting evidence:** expired/closed/"no longer accepting applications", missing JD with only nav/footer, hard redirect to a generic careers/search page, or 404/410 3. If the posting appears closed, **stop before Block A**: tell the candidate the link is dead, and if the entry came from `data/pipeline.md`, mark it `- [x] ~~Company | Role~~ — oferta nieaktywna`. Do not generate an evaluation, report, or CV. 4. If the candidate pasted JD text (no URL), liveness cannot be verified — note that and proceed; there is no link to check. Do not continue to Block A until this gate is resolved. The snapshot captured here is reused by Block G's freshness signals. ## Bounded Research Budget Company, compensation, and hiring-signal research must be a single-pass lookup, not an open-ended investigation. This mode is an evaluation workflow, not deep company research. Hard limits for Blocks D and G combined: - hard cap: 5 total WebSearch queries - Prefer targeted queries that answer more than one question; stop early when enough evidence exists. - Do not invoke `deep-research`, `deep`, or any other research skill. - Do not spawn subagents or delegate research to another agent. - Do not continue researching after the query cap is reached; summarize the evidence found and explicitly mark missing data as unavailable. If deeper company research is useful, recommend running `/career-ops deep` separately after the evaluation. ## Step 0 — Archetype Detection Classify the job into one of the 6 archetypes (see `_shared.md`). If it is a hybrid, indicate the 2 closest ones. This determines: - Which proof points to prioritize in block B - How to rewrite the summary in block E - Which STAR stories to prepare in block F ## Block A — Role Summary Table with: - Archetype detected - Domain (platform/agentic/LLMOps/ML/enterprise) - Function (build/consult/manage/deploy) - Seniority - Remote (full/hybrid/onsite) - Team size (if mentioned) - TL;DR in 1 sentence ### Geo-mismatch check After filling the Remote row, cross-check the posting's **structured location field** (the location/remote designation shown on the posting page or in ATS metadata — not the Remote row you just wrote) against the JD body: - **Contradiction** = the location field says remote, but the JD body states a **binding attendance requirement**: "hybrid", "X days per week/month" in office, "in-office", "onsite"/"on-site", mandatory office attendance, or a relocation requirement. - **Not a contradiction:** negations ("no onsite requirement"), optional or occasional in-person events ("quarterly offsites", "optional co-working space"), or generic benefits boilerplate. - If the JD body says nothing about location or attendance, emit no flag — silence is absence of signal, not agreement. - If the input has no structured location field (pasted JD text only), skip this check. On contradiction, add exactly one flag line at the top of Block B in the report, quoting the evidence **verbatim** (never paraphrase): `⚠️ **Geo-mismatch:** location field says remote, but JD body says "{verbatim JD line}"` The flag is an additive line only — Block B's existing content stays unchanged below it, and no flag line appears when there is no contradiction. ## Block B — Match with CV Read `cv.md`. Create a table with each JD requirement mapped to exact lines in the CV. **Adapted to the archetype:** - If FDE → prioritize delivery speed and client-facing proof points - If SA → prioritize system design and integrations - If PM → prioritize product discovery and metrics - If LLMOps → prioritize evals, observability, pipelines - If Agentic → prioritize multi-agent, HITL, orchestration - If Transformation → prioritize change management, adoption, scaling **Gaps** section with mitigation strategy for each. For each gap: 1. Is it a hard blocker or a nice-to-have? 2. Can the candidate demonstrate adjacent experience? 3. Is there a portfolio project that covers this gap? 4. Concrete mitigation plan (phrase for cover letter, quick project, etc.) ## Block C — Level and Strategy 1. **Level detected** in the JD vs **candidate's natural level for that archetype** 2. **"Sell senior without lying" plan**: specific phrases adapted to the archetype, concrete achievements to highlight, how to position founder experience as an advantage 3. **"If they downlevel me" plan**: accept if compensation is fair, negotiate 6-month review, clear promotion criteria ## Block D — Comp and Demand Use the bounded research budget above for: - Current salaries for the role (Glassdoor, Levels.fyi, Blind) - Company's compensation reputation - Demand trend for the role Table with data and cited sources. If there is no data, state it instead of inventing. ## Block E — Customization Plan | # | Section | Current status | Proposed change | Why | |---|---------|---------------|------------------|---------| | 1 | Summary | ... | ... | ... | | ... | ... | ... | ... | ... | Top 5 changes to CV + Top 5 changes to LinkedIn to maximize match. ## Block F — Interview Plan 6-10 STAR+R stories mapped to JD requirements (STAR + **Reflection**): | # | JD Requirement | STAR+R Story | S | T | A | R | Reflection | |---|-----------------|-----------------|---|---|---|---|------------| The **Reflection** column captures what was learned or what would be done differently. This signals seniority — junior candidates describe what happened, senior candidates extract lessons. **Story Bank:** If `interview-prep/story-bank.md` exists, check if any of these stories are already there. If not, append new ones. Over time this builds a reusable bank of 5-10 master stories that can be adapted to any interview question. **Selected and framed according to the archetype:** - FDE → emphasize delivery speed and client-facing - SA → emphasize architectural decisions - PM → emphasize discovery and trade-offs - LLMOps → emphasize metrics, evals, production hardening - Agentic → emphasize orchestration, error handling, HITL - Transformation → emphasize adoption, organizational change Also include: - 1 recommended case study (which of their projects to present and how) - Red-flag questions and how to answer them (e.g., "why did you sell your company?", "do you have a team of reports?") ## Block G — Posting Legitimacy Analyze the job posting for signals that indicate whether this is a real, active opening. This helps the user prioritize their effort on opportunities most likely to result in a hiring process. **Ethical framing:** Present observations, not accusations. Every signal has legitimate explanations. The user decides how to weigh them. ### Signals to analyze (in order): **1. Posting Freshness** (from the Playwright snapshot captured during the liveness gate, or in `auto-pipeline` Step 0; unavailable if only JD text was pasted): - Date posted or "X days ago" -- extract from page - Apply button state (active / closed / missing / redirects to generic page) - If URL redirected to generic careers page, note it **2. Description Quality** (from JD text): - Does it name specific technologies, frameworks, tools? - Does it mention team size, reporting structure, or org context? - Are requirements realistic? (years of experience vs technology age) - Is there a clear scope for the first 6-12 months? - Is salary/compensation mentioned? - What ratio of the JD is role-specific vs generic boilerplate? - Any internal contradictions? (entry-level title + staff requirements, etc.) **3. Company Hiring Signals** (use remaining queries from the bounded research budget, combine with Block D research): - Search: `"{company}" layoffs {year}` -- note date, scale, departments - Search: `"{company}" hiring freeze {year}` -- note any announcements - If layoffs found: are they in the same department as this role? **4. Reposting Detection** (from scan-history.tsv): - Check if company + similar role title appeared before with a different URL - Note how many times and over what period **5. Role Market Context** (qualitative, no additional queries): - Is this a common role that typically fills in 4-6 weeks? - Does the role make sense for this company's business? - Is the seniority level one that legitimately takes longer to fill? ### Output format: **Assessment:** One of three tiers: - **High Confidence** -- Multiple signals suggest a real, active opening - **Proceed with Caution** -- Mixed signals worth noting - **Suspicious** -- Multiple ghost job indicators, investigate before investing time **Signals table:** Each signal observed with its finding and weight (Positive / Neutral / Concerning). **Context Notes:** Any caveats (niche role, government job, evergreen position, etc.) that explain potentially concerning signals. ### Edge case handling: - **Government/academic postings:** Longer timelines are standard. Adjust thresholds (60-90 days is normal). - **Evergreen/continuous hire postings:** If the JD explicitly says "ongoing" or "rolling," note it as context -- this is not a ghost job, it is a pipeline role. - **Niche/executive roles:** Staff+, VP, Director, or highly specialized roles legitimately stay open for months. Adjust age thresholds accordingly. - **Startup / pre-revenue:** Early-stage companies may have vague JDs because the role is genuinely undefined. Weight description vagueness less heavily. - **No date available:** If posting age cannot be determined and no other signals are concerning, default to "Proceed with Caution" with a note that limited data was available. NEVER default to "Suspicious" without evidence. - **Recruiter-sourced (no public posting):** Freshness signals unavailable. Note that active recruiter contact is itself a positive legitimacy signal. --- ## Cover Letter Draft (auto-generated after Block G) After saving the report and recording in the tracker, append a cover letter draft to the report file under `## Cover Letter Draft`. This is a starting point — not the final letter. The user completes it via `/career-ops cover {slug}`. **How to generate the draft:** 1. Read `cv.md` — select 4 achievement bullets most relevant to the JD's top requirements (exact wording, real metrics only) 2. Read `config/profile.yml` — extract candidate name, current role, years of experience 3. Write a 2-sentence opening based on the role title and JD mission language 4. Write a 1-paragraph profile intro from the cv.md summary, adapted to the JD domain 5. Leave the "Problems / Why this company / Approach" section as a placeholder — this requires user input 6. Detect and flag any gaps (domain mismatch, language requirement, start date urgency) so the user sees them immediately **Draft format to append to the report:** ```markdown ## Cover Letter Draft > Draft generated at evaluation time. Complete via `/career-ops cover {slug}` to fill in angles, confirm research, and generate the PDF. > Gaps flagged below — address them during the cover flow. --- **Opening** *(placeholder — refine with your "why this role" angle)* {2-sentence opening based on JD role title and mission language} **Profile introduction** {1 paragraph from cv.md summary, adapted to JD domain and required competencies} **Key achievements** *(selected from cv.md — exact wording preserved)* - **{lead from cv.md},** {impact sentence with metric}. - **{lead from cv.md},** {impact sentence with metric}. - **{lead from cv.md},** {impact sentence with metric}. - **{lead from cv.md},** {impact sentence with metric}. **Problems I will solve** *(placeholder — requires company research + your input)* > To be completed: what challenges does {company} face that you'd address? How would you approach them? **Closing** I am happy to discuss further at your convenience. --- **Gaps flagged:** {List any detected gaps — domain mismatch, language requirement, start date urgency, title mismatch. If none, write "None detected."} **JD keywords to mirror** *(extracted for ATS + human read)* {8-10 exact phrases from the JD} --- *Run `/career-ops cover {slug}` to complete angles, confirm company research, and generate the PDF.* ``` Apply all language rules from `_shared.md` Professional Writing section to the draft content. No em dashes, no buzzwords, active voice, concrete claims only. --- ## Post-evaluation **ALWAYS** after generating blocks A-G: ### 1. Save report .md Save full evaluation in `reports/{###}-{company-slug}-{YYYY-MM-DD}.md`. - `{###}` = next sequential number (3 digits, zero-padded). To allocate it atomically and prevent race conditions, you MUST run `node reserve-report-num.mjs` to claim the number (stdout returns `{###}`), write the report, and then run `node reserve-report-num.mjs --release {###}` to release the sentinel. - `{company-slug}` = company name in lowercase, without spaces (use hyphens) - `{YYYY-MM-DD}` = current date **Report format:** ```markdown # Evaluation: {Company} — {Role} **Date:** {YYYY-MM-DD} **URL:** **Archetype:** {detected} **Score:** {X/5} **Legitimacy:** {High Confidence | Proceed with Caution | Suspicious} **PDF:** {path or pending} --- ## A) Role Summary (full content of block A) ## B) Match with CV (full content of block B) ## C) Level and Strategy (full content of block C) ## D) Comp and Demand (full content of block D) ## E) Customization Plan (full content of block E) ## F) Interview Plan (full content of block F) ## G) Posting Legitimacy (full content of block G) ## H) Draft Application Answers (only if score >= 4.5 — draft answers for the application form) --- ## Keywords extracted (list of 15-20 keywords from the JD for ATS optimization) ``` ### 2. Record in tracker **ALWAYS** record in `data/applications.md`: - Next sequential number - Current date - Company - Role - Score: match average (1-5) - Status: `Evaluated` - PDF: ❌ (or ✅ if auto-pipeline generated PDF) - Report: root-relative link `[001](reports/001-company-2026-01-01.md)` (when merged via `merge-tracker.mjs` it is normalized to be relative to the tracker's own dir, e.g. `../reports/...`; see #760) **Tracker format:** ```markdown | # | Date | Company | Role | Score | Status | PDF | Report | ```