Company Jobs
Overview
Find and return current vacancies from a company's official hiring surface. Prefer direct company or ATS sources over aggregators, verify information with live browsing when possible, and cite every source used.
When the requested output is a jobs digest, keep the collection, normalization, delivery, and inbox-cleanup steps in the same flow so the recipient ends up with the final formatted HTML email only.
Workflow
Identify the official careers source.
- If the user provides a careers URL, start there.
- If the user provides only a company name, search the web for the official careers page, jobs page, or linked ATS board.
- Prefer official company domains and first-party linked ATS providers over LinkedIn, Indeed, Glassdoor, or scraped mirrors.
Collect openings.
- Run
scripts/job_scraper.py against the careers URL for a first pass:
python <skill-dir>/scripts/job_scraper.py "https://example.com/careers" --max-pages 40 --output markdown
- If the page is JavaScript-heavy, protected by consent UI, or incomplete, use browser or web tools to inspect the rendered page and linked ATS endpoints.
- Read pagination, departments, location filters, and remote or hybrid filters. Do not assume the first page is complete.
Normalize each role.
- Capture title, location or remote status, department or team when available, employment type when available, and the direct application or job-detail URL.
- Preserve exact public-facing titles.
- Deduplicate repeated roles across pagination, alternate URLs, or ATS detail pages.
- Exclude expired, closed, speculative, or general-application or talent-pool roles unless the user asks for them.
- If a public detail page is incomplete or unavailable, say that explicitly in
note or risk and lower confidence instead of guessing.
Package the result.
- For a plain jobs answer, return a compact table in the user's language.
- For digests, normalize each kept role into a delivery object with:
title
company
location
model
source
score
decision
confidence
why
risk
url
- Sort valid roles by score descending.
- Put the top roles in
jobs and the remaining valid roles in otherJobs.
Deliver the digest when asked.
- Use
template: "job-alerts" for aggregated or multi-company digests.
- Use
template: "career-company-jobs" for single-company digests.
- Read
references/digest-delivery.md before sending any Apps Script or Gmail-based digest.
- If manual HTML rendering is truly required, use
assets/job-fit-digest-template.html as the canonical fallback layout instead of inventing a new email shape.
CV Handoff Notes
When the user asks to use discovered vacancies to tailor Ruben's CV, hand the vacancy text to career-tailor-cv-to-job and preserve the current project CV base additions:
- Keep
Claude Code, OpenAi Codex, and Agent Skills in "Habilidades e Competencias".
- Keep
Claude Code in Action - Anthropic, Introduction to Agent Skills - Anthropic, Introduction to Model Context Protocol - Anthropic, and Buiding with the Claude API - Anthropic in "Formacao Complementar", using the same one-course-per-line style as the existing section.
- Do not reinsert
Idiomas or Ingles unless the user explicitly asks.
Output Format
Use this shape unless the user requests another format:
Encontrei N vagas abertas em <empresa> em <data>.
| Vaga | Local | Area | Link |
| --- | --- | --- | --- |
| <title> | <location> | <department> | <url> |
Fontes: <career page>, <ATS page if separate>
Observacoes: <pagination/rendering limitations, if any>
For email digests, keep the payload and delivery rules in references/digest-delivery.md.
Source Handling
- Browse for current data; job listings change frequently.
- Cite the exact pages checked.
- If using search results to discover the careers page, still validate against the official page.
- Do not log in, bypass access controls, solve CAPTCHAs, or scrape private or internal job systems.
- Respect rate limits. Keep crawls small and targeted.
Delivery Guardrails
- Never replace a requested formatted digest with a simplified plain-text fallback.
- Never leave relay payload JSON or temporary helper emails visible in the recipient inbox once the final digest exists.
- If the Apps Script Web App POST fails, use the Gmail relay flow from
references/digest-delivery.md, verify the final HTML digest from Ruben Job Fit Alerts, and archive the relay or helper emails so only the final digest remains in inbox.
- Keep JSON and payload text in UTF-8. Do not replace accents with HTML entities in the payload.
Script Notes
scripts/job_scraper.py is a best-effort helper for static HTML, JSON-LD JobPosting, and common ATS link patterns. Treat it as a discovery aid, not the final authority. For dynamic boards such as Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Workable, Gupy, and BambooHR, combine script output with direct browser inspection when needed.
Read references/job-board-patterns.md only when a site uses a known ATS or the first pass misses obvious listings.
1---2name: career-company-jobs3description: Find current job openings from official company careers surfaces and build single-company or aggregated HTML job digests from primary sources. Use when Codex needs to search company careers pages or ATS boards, collect and normalize current openings, package them for a career-company-jobs or job-alerts digest, or deliver the digest through Apps Script and Gmail relay without leaving raw payload emails visible in the inbox.4---56# Company Jobs78## Overview910Find and return current vacancies from a company's official hiring surface. Prefer direct company or ATS sources over aggregators, verify information with live browsing when possible, and cite every source used.1112When the requested output is a jobs digest, keep the collection, normalization, delivery, and inbox-cleanup steps in the same flow so the recipient ends up with the final formatted HTML email only.1314## Workflow15161. Identify the official careers source.17 - If the user provides a careers URL, start there.18 - If the user provides only a company name, search the web for the official careers page, jobs page, or linked ATS board.19 - Prefer official company domains and first-party linked ATS providers over LinkedIn, Indeed, Glassdoor, or scraped mirrors.20212. Collect openings.22 - Run `scripts/job_scraper.py` against the careers URL for a first pass:2324```bash25python <skill-dir>/scripts/job_scraper.py "https://example.com/careers" --max-pages 40 --output markdown26```2728 - If the page is JavaScript-heavy, protected by consent UI, or incomplete, use browser or web tools to inspect the rendered page and linked ATS endpoints.29 - Read pagination, departments, location filters, and remote or hybrid filters. Do not assume the first page is complete.30313. Normalize each role.32 - Capture title, location or remote status, department or team when available, employment type when available, and the direct application or job-detail URL.33 - Preserve exact public-facing titles.34 - Deduplicate repeated roles across pagination, alternate URLs, or ATS detail pages.35 - Exclude expired, closed, speculative, or general-application or talent-pool roles unless the user asks for them.36 - If a public detail page is incomplete or unavailable, say that explicitly in `note` or `risk` and lower confidence instead of guessing.37384. Package the result.39 - For a plain jobs answer, return a compact table in the user's language.40 - For digests, normalize each kept role into a delivery object with:41 - `title`42 - `company`43 - `location`44 - `model`45 - `source`46 - `score`47 - `decision`48 - `confidence`49 - `why`50 - `risk`51 - `url`52 - Sort valid roles by score descending.53 - Put the top roles in `jobs` and the remaining valid roles in `otherJobs`.54555. Deliver the digest when asked.56 - Use `template: "job-alerts"` for aggregated or multi-company digests.57 - Use `template: "career-company-jobs"` for single-company digests.58 - Read `references/digest-delivery.md` before sending any Apps Script or Gmail-based digest.59 - If manual HTML rendering is truly required, use `assets/job-fit-digest-template.html` as the canonical fallback layout instead of inventing a new email shape.6061## CV Handoff Notes6263When the user asks to use discovered vacancies to tailor Ruben's CV, hand the vacancy text to `career-tailor-cv-to-job` and preserve the current project CV base additions:6465- Keep `Claude Code`, `OpenAi Codex`, and `Agent Skills` in "Habilidades e Competencias".66- Keep `Claude Code in Action - Anthropic`, `Introduction to Agent Skills - Anthropic`, `Introduction to Model Context Protocol - Anthropic`, and `Buiding with the Claude API - Anthropic` in "Formacao Complementar", using the same one-course-per-line style as the existing section.67- Do not reinsert `Idiomas` or `Ingles` unless the user explicitly asks.6869## Output Format7071Use this shape unless the user requests another format:7273```markdown74Encontrei N vagas abertas em <empresa> em <data>.7576| Vaga | Local | Area | Link |77| --- | --- | --- | --- |78| <title> | <location> | <department> | <url> |7980Fontes: <career page>, <ATS page if separate>81Observacoes: <pagination/rendering limitations, if any>82```8384For email digests, keep the payload and delivery rules in `references/digest-delivery.md`.8586## Source Handling8788- Browse for current data; job listings change frequently.89- Cite the exact pages checked.90- If using search results to discover the careers page, still validate against the official page.91- Do not log in, bypass access controls, solve CAPTCHAs, or scrape private or internal job systems.92- Respect rate limits. Keep crawls small and targeted.9394## Delivery Guardrails9596- Never replace a requested formatted digest with a simplified plain-text fallback.97- Never leave relay payload JSON or temporary helper emails visible in the recipient inbox once the final digest exists.98- If the Apps Script Web App POST fails, use the Gmail relay flow from `references/digest-delivery.md`, verify the final HTML digest from `Ruben Job Fit Alerts`, and archive the relay or helper emails so only the final digest remains in inbox.99- Keep JSON and payload text in UTF-8. Do not replace accents with HTML entities in the payload.100101## Script Notes102103`scripts/job_scraper.py` is a best-effort helper for static HTML, JSON-LD `JobPosting`, and common ATS link patterns. Treat it as a discovery aid, not the final authority. For dynamic boards such as Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Workable, Gupy, and BambooHR, combine script output with direct browser inspection when needed.104105Read `references/job-board-patterns.md` only when a site uses a known ATS or the first pass misses obvious listings.