Description du poste
### Source name and URL
CalCareers: https://calcareers.ca.gov
### Who operates the source?
California Department of Human Resources (CalHR). I am not the operator.
### Operator contact at the source's own domain
CalCareer@calhr.ca.gov ([contact page](https://calcareers.ca.gov/CalHRPublic/GeneralInfo/ContactUs.aspx))
### Public read access
The site offers no API or RSS feed. It serves public ASP.NET pages and requires no account.
- Results render only after a form submit, and paging uses `__doPostBack`. The scanner therefore needs Playwright, like `scan-interamt.mjs`.
- Posting URLs work without a session: `JobPosting.aspx?JobControlId={id}`.
- I checked on 2026-11-08: `transportation engineer` returned 32 jobs across four pages.
### Rule 1 — real, attributed, free for candidates
Yes. Named state departments post real vacancies. Candidates read and apply for free.
### Rule 2 — canonical URL
`https://calcareers.ca.gov/CalHrPublic/Jobs/JobPosting.aspx?JobControlId={id}`
### Rule 3 — promoted content and complete inventory
The site has no promoted listings. The scanner walks every page and checks its total against the site's "N job(s) found" count.
### Rule 6 — robots.txt
```
#robots file
#may be needed in beta site to exclude crawlers
#User-agent: *
#Disallow: /
```
Every line is commented out, so robots.txt disallows nothing.
### Provider PR (optional)
Not yet. I want to confirm the approach first.
### Anything else
I plan to add `scan-calcareers.mjs`, modeled on `scan-interamt.mjs`. It reads `calcareers_searches` from `portals.yml`, writes through `scan.mjs`, and includes offline fixture tests.
The scanner covers California state jobs only. The `neogov` source already covers cities and counties.