/offer — Pipeline tracking and scanning
One record: career/tracker.md. No side spreadsheets.
Statuses
| Status |
Evidence |
DRAFT |
folder exists, nothing sent |
BLOCKED |
materials ready, hard constraint unresolved — do not apply |
APPLIED |
confirmation page or "application received" |
SCREEN |
recruiter / hiring-manager call scheduled or done |
OA |
assessment or take-home link |
TECH |
phone technical or virtual rounds in progress |
ONSITE |
final loop scheduled |
OFFER |
written offer (record base / bonus / equity / deadline in Next step) |
REJECTED |
explicit rejection — note the stage |
GHOSTED |
no reply ≥ 3 weeks after the last touchpoint, after one follow-up |
WITHDRAWN |
user withdrew |
Only change a status on evidence. An automatic receipt is APPLIED, never SCREEN. Unclear → keep the status, write unconfirmed in Next step.
Updating
- Extract date, company, role, req, new status, next action, deadlines (OA expiry, offer deadline, interview time with timezone).
- Merge into the existing row; later stages overwrite earlier. New row only for a new application (respect
max_roles_per_company).
- Next step is an action with a date:
follow up on LinkedIn 2026-09-26, OA due 2026-09-20 23:59 ET, loop 2026-09-22 — run /interview grill system_design.
- Follow-up: 10 business days after
APPLIED with silence → one LinkedIn message (/great-resume outreach format), note the date; ~2 more weeks → GHOSTED.
- Interview scheduled → suggest
/interview on that folder and a fresh 1-page export if the sent version was 2 pages.
- Offer → record the numbers; never negotiate or send anything.
Scanning (needs jobs-mcp)
Read career/targets.yaml; call scan with boards_, linkedin_queries, hours, include_regex, exclude_regex, location_regex. Append results to career/SCAN-<YYYY-MM-DD>.md as | Company | Role | Location | Posted | URL | first-look GAP |, then for each promising posting either run /job-match → /make-resume → /job-apply the same day or list it for the user (portals they handle themselves). Drop postings that violate max_years_required or salary_floor when the posting states them. Never re-list a URL already in the tracker or a previous scan.
If jobs-mcp is not available, say so and give the manual URLs (boards.greenhouse.io/<token>, jobs.lever.co/<company>, jobs.ashbyhq.com/<org>).
Mailbox triage
Use the browser; the user logs in (never handle passwords, MFA, codes). Search by company, "interview", "assessment", "application". Map: received/thank you → APPLIED; recruiter call → SCREEN; HackerRank/CodeSignal/take-home → OA; technical interview → TECH; onsite/final → ONSITE; offer → OFFER; "not moving forward" → REJECTED. Copy no email bodies — company, role, status, date, next step only.
Deliverable
Rows changed (before → after, one-phrase evidence) · deadlines and interviews in the next 7 days · follow-ups due now · missing information to supply. career/tracker.md stays private.
1---2name: offer3description: Maintain the application pipeline in career/tracker.md — new applications, recruiter screens, OAs, interview loops, offers, rejections, follow-ups — from emails, screenshots, or chat, and run the daily new-postings scan through jobs-mcp using career/targets.yaml. Use when the user types /offer, reports an interview invite, rejection, or offer, asks what to follow up on, wants the pipeline summarised, or asks to scan for new jobs.4---56# /offer — Pipeline tracking and scanning78One record: `career/tracker.md`. No side spreadsheets.910## Statuses1112| Status | Evidence |13|---|---|14| `DRAFT` | folder exists, nothing sent |15| `BLOCKED` | materials ready, hard constraint unresolved — do not apply |16| `APPLIED` | confirmation page or "application received" |17| `SCREEN` | recruiter / hiring-manager call scheduled or done |18| `OA` | assessment or take-home link |19| `TECH` | phone technical or virtual rounds in progress |20| `ONSITE` | final loop scheduled |21| `OFFER` | written offer (record base / bonus / equity / deadline in Next step) |22| `REJECTED` | explicit rejection — note the stage |23| `GHOSTED` | no reply ≥ 3 weeks after the last touchpoint, after one follow-up |24| `WITHDRAWN` | user withdrew |2526Only change a status on evidence. An automatic receipt is `APPLIED`, never `SCREEN`. Unclear → keep the status, write `unconfirmed` in Next step.2728## Updating29301. Extract date, company, role, req, new status, next action, deadlines (OA expiry, offer deadline, interview time with timezone).312. Merge into the existing row; later stages overwrite earlier. New row only for a new application (respect `max_roles_per_company`).323. Next step is an action with a date: `follow up on LinkedIn 2026-09-26`, `OA due 2026-09-20 23:59 ET`, `loop 2026-09-22 — run /interview grill system_design`.334. Follow-up: 10 business days after `APPLIED` with silence → one LinkedIn message (`/great-resume` outreach format), note the date; ~2 more weeks → `GHOSTED`.345. Interview scheduled → suggest `/interview` on that folder and a fresh 1-page export if the sent version was 2 pages.356. Offer → record the numbers; never negotiate or send anything.3637## Scanning (needs jobs-mcp)3839Read `career/targets.yaml`; call `scan` with `boards_`, `linkedin_queries`, `hours`, `include_regex`, `exclude_regex`, `location_regex`. Append results to `career/SCAN-<YYYY-MM-DD>.md` as `| Company | Role | Location | Posted | URL | first-look GAP |`, then for each promising posting either run `/job-match → /make-resume → /job-apply` the same day or list it for the user (portals they handle themselves). Drop postings that violate `max_years_required` or `salary_floor` when the posting states them. Never re-list a URL already in the tracker or a previous scan.4041If `jobs-mcp` is not available, say so and give the manual URLs (`boards.greenhouse.io/<token>`, `jobs.lever.co/<company>`, `jobs.ashbyhq.com/<org>`).4243## Mailbox triage4445Use the browser; the user logs in (never handle passwords, MFA, codes). Search by company, "interview", "assessment", "application". Map: received/thank you → `APPLIED`; recruiter call → `SCREEN`; HackerRank/CodeSignal/take-home → `OA`; technical interview → `TECH`; onsite/final → `ONSITE`; offer → `OFFER`; "not moving forward" → `REJECTED`. Copy no email bodies — company, role, status, date, next step only.4647## Deliverable4849Rows changed (before → after, one-phrase evidence) · deadlines and interviews in the next 7 days · follow-ups due now · missing information to supply. `career/tracker.md` stays private.