stage-cli 1.0.0__tar.gz → 1.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {stage_cli-1.0.0 → stage_cli-1.1.0}/CHANGELOG.md +29 -1
- {stage_cli-1.0.0 → stage_cli-1.1.0}/PKG-INFO +4 -4
- {stage_cli-1.0.0 → stage_cli-1.1.0}/README.md +3 -3
- {stage_cli-1.0.0 → stage_cli-1.1.0}/SECURITY.md +8 -5
- {stage_cli-1.0.0 → stage_cli-1.1.0}/assets/ci-flow.svg +1 -1
- stage_cli-1.1.0/src/stage/__init__.py +1 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/commands/pipeline.py +3 -2
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/notify.py +13 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/a.yaml +41 -18
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/b.yaml +15 -8
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/c.yaml +32 -10
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/d.yaml +7 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/e.yaml +22 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/f.yaml +15 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/g.yaml +18 -9
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/h.yaml +8 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/i.yaml +7 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/j.yaml +7 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/m.yaml +27 -2
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/n.yaml +24 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/p.yaml +45 -16
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/q.yaml +8 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/r.yaml +15 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/s.yaml +63 -5
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/t.yaml +7 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/u.yaml +12 -4
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/v.yaml +4 -3
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/w.yaml +21 -6
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/z.yaml +14 -6
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/screens/postings.py +6 -3
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/state.py +1 -1
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_notify.py +73 -0
- stage_cli-1.0.0/src/stage/__init__.py +0 -1
- {stage_cli-1.0.0 → stage_cli-1.1.0}/.gitattributes +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/.gitignore +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/.python-version +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/LICENSE +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/assets/cli.png +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/assets/tui.png +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/pyproject.toml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/__main__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/banner.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/bootstrap/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/bootstrap/openjobs.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/classify/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/classify/eligibility.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/classify/internship.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/classify/role.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/classify/scope.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/app.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/commands/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/commands/discovery.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/commands/insight.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/commands/postings.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/commands/schedule.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/housekeeping.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/logfile.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/options.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/render.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/runlock.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/schedule.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/schedule_state.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/selection.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/serialize.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/companies.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/k.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/l.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/o.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/other.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/x.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/y.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/fonts/DejaVuSans.LICENSE.txt +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/fonts/DejaVuSans.ttf +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/company_tokens.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/eligibility.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/inclusive_suffixes.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/internship.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/language.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/locations.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/roles.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/terms.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/workday_facets.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/seed_companies.yaml +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/dedup/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/dedup/identity.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/dedup/resolve.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/company.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/coverage.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/custom_board.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/discovery.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/enums.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/events.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/filters.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/health.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/ids.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/job.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/matching.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/priority.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/quarantine.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/rate_state.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/retention.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/rotation.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/signals.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/sync_run.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/text.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/validator.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/visits.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/workday.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/http/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/http/breaker.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/http/cache.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/http/client.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/http/profiles.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/lexicon.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/normalize/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/normalize/language.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/normalize/location.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/normalize/terms.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/normalize/urls.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/paths.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/py.typed +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/canary.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/coverage.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/discover.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/export.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/health.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/maintenance.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/quarantine.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/query.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/sync.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/_text.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/ashby.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/bamboohr.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/base.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/breezy.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/collage.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/community_feeds.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/curated_markdown.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/custom_json.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/espresso.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/feed.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/greenhouse.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/jobbank.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/jobvite.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/lever.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/oracle_cloud.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/platforms.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/quebec_emploi.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/recruitee.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/simplify.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/smartrecruiters.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/speedyapply.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/themuse.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/workable.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/workday.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/zshah.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/storage/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/storage/migrations/0001_initial.sql +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/storage/migrations/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/storage/repository.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/storage/search.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/storage/sqlite_repo.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/storage/writer.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/app.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/help.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/safe.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/screens/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/screens/boards.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/screens/review.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/screens/splash.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/screens/stats.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/screens/sync.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/theme.tcss +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/widgets/__init__.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/conftest.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/bilingual_titles.json +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/blackrock_search.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/croesus_career.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/disney_search.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/ea_searchjobs.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/espresso_search.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/gildan_openpositions.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/greenhouse_jobs.json +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/jobbank_search.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/jobvite_agscareer.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/jobvite_resolver.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/l3harris_search.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/lightspeed_openings.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/loblaw_jobs.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/nbc_search.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/parsons_search.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/publicissapient_sitemap.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/rentec_careers.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/sega_vacancies.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/sfrmk_search.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/shopify_internships.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/twosigma_openroles.html +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/golden/classification.json +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_adapter_salvage.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_adopt_unregistered.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_board_identity.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_board_rest.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_canary.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_canary_events.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_classify.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_cli_help.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_cli_options.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_collage_adapter.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_companies_registry.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_company_fold_key.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_coverage.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_curated_markdown.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_custom_json.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_custom_json_buckets.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_custom_json_formats.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_custom_json_pagination.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_dedup.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_degree_and_disciplines.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_detail_queue.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_discover.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_eligibility.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_export.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_feed_adapters.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_feeds.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_fetch_authority.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_fold_inclusive.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_golden.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_greenhouse_adapter.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_health.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_housekeeping.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_html_boards.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_html_text.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_http_akamai.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_http_client.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_http_conditional.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_http_resilience.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_integrity_repair.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_jobvite_adapter.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_language.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_layering.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_lever_adapter.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_lexicon.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_location.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_malformed_input.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_migrations.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_new_adapters.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_openjobs_crossref.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_oracle_cloud_adapter.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_paths.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_permissions.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_platform_shapes.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_profiles.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_quarantine.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_quarantine_relabel.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_quebec_emploi.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_rate_state.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_recall_limits.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_recheck.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_registry_shards.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_render.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_request_log.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_rescreen.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_review_contradictions.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_rotation.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_run_budget.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_schedule.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_schedule_state.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_schema_baseline.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_search.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_serialize.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_show.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_signals_persist.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_smartrecruiters_adapter.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_speedyapply.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_startup_budget.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_sync_e2e.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_sync_shape.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_sync_step2.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_terms.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_tombstones.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_tui.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_unregistered_quarantine.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_untrusted_display.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_update_badges.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_verify_registry.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_workday_adapter.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_workday_urls.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_writer.py +0 -0
- {stage_cli-1.0.0 → stage_cli-1.1.0}/uv.lock +0 -0
|
@@ -4,6 +4,33 @@ All notable changes to this project are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
|
|
5
5
|
follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [1.1.0] - 2026-09-03
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Discord notifications now lead with Montreal postings, then the rest of Canada,
|
|
12
|
+
and put software engineering ahead of quant inside each place. Nothing is
|
|
13
|
+
filtered out; the whole batch is still there, in the order you care about.
|
|
14
|
+
- 43 more employers, taking the registry to 1,530. Every one was reached in a
|
|
15
|
+
live sync before it was added, and none was found by guessing a slug.
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- ClickHouse moved off Greenhouse, which now answers 404 for that slug; the row
|
|
20
|
+
points at its Ashby board, which returns 177 postings. Marqeta, Gloss Genius and
|
|
21
|
+
Veeda AI answer 404 on every platform and are disabled rather than removed, so
|
|
22
|
+
discovery does not re-add them.
|
|
23
|
+
- Searching in the TUI no longer stalls. Each keystroke used to queue a query on
|
|
24
|
+
the single database thread, and cancelling the worker did not cancel the query
|
|
25
|
+
already running, so typing three letters took about ten seconds. Keystrokes are
|
|
26
|
+
now collected for 180ms before a search runs.
|
|
27
|
+
|
|
28
|
+
### Notes
|
|
29
|
+
|
|
30
|
+
- A Discord message is bounded by the 6,000 characters Discord allows, not by a
|
|
31
|
+
posting count, so a batch of long titles and URLs shows fewer rows than a batch
|
|
32
|
+
of short ones.
|
|
33
|
+
|
|
7
34
|
## [1.0.0] - 2026-09-01
|
|
8
35
|
|
|
9
36
|
First release. Stage collects CS internship postings from company job boards
|
|
@@ -12,7 +39,7 @@ them in a SQLite database on your own machine.
|
|
|
12
39
|
|
|
13
40
|
### What it does
|
|
14
41
|
|
|
15
|
-
- **Reads 1,
|
|
42
|
+
- **Reads 1,450+ employers** across 15 ATS platforms — Greenhouse, Lever, Ashby,
|
|
16
43
|
Workday, SmartRecruiters, Workable and more — through 13 adapters, plus 11
|
|
17
44
|
community feeds.
|
|
18
45
|
- **Filters hard.** It has kept 4,165 postings and rejected 134,368. Senior
|
|
@@ -42,4 +69,5 @@ them in a SQLite database on your own machine.
|
|
|
42
69
|
|
|
43
70
|
Python 3.12, 3.13 or 3.14 on macOS, Linux or Windows.
|
|
44
71
|
|
|
72
|
+
[1.1.0]: https://github.com/NicholasXydis/Stage/releases/tag/v1.1.0
|
|
45
73
|
[1.0.0]: https://github.com/NicholasXydis/Stage/releases/tag/v1.0.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: stage-cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.1.0
|
|
4
4
|
Summary: Aggregates CS internship postings (Canada/US, EN + FR) into a local SQLite database
|
|
5
5
|
Project-URL: Homepage, https://github.com/NicholasXydis/Stage
|
|
6
6
|
Project-URL: Repository, https://github.com/NicholasXydis/Stage
|
|
@@ -59,7 +59,7 @@ Free and open source. No account, no server, no telemetry.
|
|
|
59
59
|
|
|
60
60
|

|
|
61
61
|
|
|
62
|
-
  [](https://github.com/NicholasXydis/Stage/actions/workflows/ci.yml)
|
|
63
63
|
|
|
64
64
|
<br>
|
|
65
65
|
|
|
@@ -272,7 +272,7 @@ Stage/
|
|
|
272
272
|
│ ├─ http/ rate posture, circuit breaker, validator cache
|
|
273
273
|
│ ├─ storage/ SQLite repository, migrations, FTS
|
|
274
274
|
│ └─ data/ packaged registry (a directory) and lexicons
|
|
275
|
-
├─ tests/ 2,
|
|
275
|
+
├─ tests/ 2,381 tests, 89% branch coverage
|
|
276
276
|
└─ .github/workflows/ CI, CodeQL, scheduled canary, release
|
|
277
277
|
```
|
|
278
278
|
|
|
@@ -318,7 +318,7 @@ Stage/
|
|
|
318
318
|
|
|
319
319
|
| Workflow | File | Purpose |
|
|
320
320
|
| --- | --- | --- |
|
|
321
|
-
| CI | `.github/workflows/ci.yml` | Ruff, format, mypy strict, 2,
|
|
321
|
+
| CI | `.github/workflows/ci.yml` | Ruff, format, mypy strict, 2,381 tests, coverage floor, badge drift |
|
|
322
322
|
| Supported Pythons | `.github/workflows/ci.yml` | The full suite again on 3.13 and 3.14 |
|
|
323
323
|
| Wheel | `.github/workflows/ci.yml` | Builds and smoke-tests the wheel on Ubuntu, Windows and macOS |
|
|
324
324
|
| CodeQL | `.github/workflows/codeql.yml` | Static analysis for Python and the workflows themselves |
|
|
@@ -20,7 +20,7 @@ Free and open source. No account, no server, no telemetry.
|
|
|
20
20
|
|
|
21
21
|

|
|
22
22
|
|
|
23
|
-
  [](https://github.com/NicholasXydis/Stage/actions/workflows/ci.yml)
|
|
24
24
|
|
|
25
25
|
<br>
|
|
26
26
|
|
|
@@ -233,7 +233,7 @@ Stage/
|
|
|
233
233
|
│ ├─ http/ rate posture, circuit breaker, validator cache
|
|
234
234
|
│ ├─ storage/ SQLite repository, migrations, FTS
|
|
235
235
|
│ └─ data/ packaged registry (a directory) and lexicons
|
|
236
|
-
├─ tests/ 2,
|
|
236
|
+
├─ tests/ 2,381 tests, 89% branch coverage
|
|
237
237
|
└─ .github/workflows/ CI, CodeQL, scheduled canary, release
|
|
238
238
|
```
|
|
239
239
|
|
|
@@ -279,7 +279,7 @@ Stage/
|
|
|
279
279
|
|
|
280
280
|
| Workflow | File | Purpose |
|
|
281
281
|
| --- | --- | --- |
|
|
282
|
-
| CI | `.github/workflows/ci.yml` | Ruff, format, mypy strict, 2,
|
|
282
|
+
| CI | `.github/workflows/ci.yml` | Ruff, format, mypy strict, 2,381 tests, coverage floor, badge drift |
|
|
283
283
|
| Supported Pythons | `.github/workflows/ci.yml` | The full suite again on 3.13 and 3.14 |
|
|
284
284
|
| Wheel | `.github/workflows/ci.yml` | Builds and smoke-tests the wheel on Ubuntu, Windows and macOS |
|
|
285
285
|
| CodeQL | `.github/workflows/codeql.yml` | Static analysis for Python and the workflows themselves |
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
| Version | Supported |
|
|
6
6
|
| --- | --- |
|
|
7
|
-
| 1.
|
|
7
|
+
| 1.1.0 | ✅ |
|
|
8
8
|
|
|
9
9
|
Only the latest release receives security fixes.
|
|
10
10
|
|
|
@@ -27,6 +27,7 @@ In scope:
|
|
|
27
27
|
|
|
28
28
|
- terminal escape or control-character injection from posting titles and descriptions
|
|
29
29
|
- registry fields that build a request target reaching an unintended host
|
|
30
|
+
- a redirect that carries origin-bound headers to a host they were not meant for
|
|
30
31
|
- source payloads that escape validation, the response size ceiling, or the per-host request limit
|
|
31
32
|
- unsafe deserialization of source, registry, or lexicon data
|
|
32
33
|
- path traversal through database, capture, or configuration paths
|
|
@@ -42,7 +43,9 @@ Out of scope:
|
|
|
42
43
|
- automated scanner output without a working reproduction
|
|
43
44
|
- reports requiring access to a machine, database, or configuration you do not own
|
|
44
45
|
|
|
45
|
-
Stage is a local command-line tool. It has no server, no network listener, no accounts,
|
|
46
|
-
authentication
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
Stage is a local command-line tool. It has no server, no network listener, no accounts, and
|
|
47
|
+
no user authentication. Postings are stored in a SQLite database under your own user account.
|
|
48
|
+
|
|
49
|
+
Outbound requests reach only the hosts the shipped registry names, over https, and a redirect
|
|
50
|
+
that changes origin drops the headers bound to the first one. The two registry rows that send
|
|
51
|
+
a bearer token use a board's own public key, never a credential of yours.
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
<rect x="240" y="42" width="180" height="58" rx="12" fill="#111C30" stroke="#3B82F6" stroke-width="2"/>
|
|
24
24
|
<text x="330" y="66" fill="#F0F6FC" font-size="14">ruff, format, mypy</text>
|
|
25
|
-
<text x="330" y="86" fill="#F0F6FC" font-size="14">2,
|
|
25
|
+
<text x="330" y="86" fill="#F0F6FC" font-size="14">2,381 tests, 89%</text>
|
|
26
26
|
|
|
27
27
|
<path d="M420 71H470" stroke="#3B82F6" stroke-width="3" marker-end="url(#arrow)"/>
|
|
28
28
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.1.0"
|
|
@@ -143,10 +143,11 @@ async def _announce_new_postings(repository: Any, console: Any) -> None:
|
|
|
143
143
|
since = await repository.previous_sync_at()
|
|
144
144
|
if since is None:
|
|
145
145
|
return
|
|
146
|
-
filters = replace(JobFilters(limit=
|
|
146
|
+
filters = replace(JobFilters(limit=None), first_seen_after=since)
|
|
147
147
|
listing = await list_jobs(repository, filters, window_days=None)
|
|
148
148
|
if not listing.jobs:
|
|
149
149
|
return
|
|
150
|
+
chosen = sorted(listing.jobs, key=notify.rank)[: notify.MAX_LISTED]
|
|
150
151
|
postings = [
|
|
151
152
|
notify.Posting(
|
|
152
153
|
company=job.company,
|
|
@@ -154,7 +155,7 @@ async def _announce_new_postings(repository: Any, console: Any) -> None:
|
|
|
154
155
|
location=display_location(job.location_raw),
|
|
155
156
|
url=job.apply_url_raw,
|
|
156
157
|
)
|
|
157
|
-
for job in
|
|
158
|
+
for job in chosen
|
|
158
159
|
]
|
|
159
160
|
try:
|
|
160
161
|
notify.post(webhook, notify.compose(postings, listing.total_matching))
|
|
@@ -21,6 +21,8 @@ DESCRIPTION_LIMIT = 4096
|
|
|
21
21
|
DESCRIPTION_BUDGET = 3900
|
|
22
22
|
MAX_LISTED = 40
|
|
23
23
|
TITLE_LIMIT = 200
|
|
24
|
+
LOCATION_ORDER = ("montreal", "canada")
|
|
25
|
+
ROLE_ORDER = ("swe", "quant")
|
|
24
26
|
TIMEOUT_SECONDS = 15
|
|
25
27
|
|
|
26
28
|
|
|
@@ -28,6 +30,16 @@ class NotifyError(Exception):
|
|
|
28
30
|
pass
|
|
29
31
|
|
|
30
32
|
|
|
33
|
+
def rank(job: object) -> tuple[int, int, float]:
|
|
34
|
+
location = getattr(getattr(job, "location", None), "value", "")
|
|
35
|
+
role = getattr(getattr(job, "role", None), "value", "")
|
|
36
|
+
place = LOCATION_ORDER.index(location) if location in LOCATION_ORDER else len(LOCATION_ORDER)
|
|
37
|
+
discipline = ROLE_ORDER.index(role) if role in ROLE_ORDER else len(ROLE_ORDER)
|
|
38
|
+
seen = getattr(job, "first_seen", None)
|
|
39
|
+
recency = -seen.timestamp() if seen is not None else 0.0
|
|
40
|
+
return (place, discipline, recency)
|
|
41
|
+
|
|
42
|
+
|
|
31
43
|
@dataclass(frozen=True, slots=True)
|
|
32
44
|
class Posting:
|
|
33
45
|
company: str
|
|
@@ -162,6 +174,7 @@ __all__ = [
|
|
|
162
174
|
"compose",
|
|
163
175
|
"forget",
|
|
164
176
|
"post",
|
|
177
|
+
"rank",
|
|
165
178
|
"read",
|
|
166
179
|
"redact",
|
|
167
180
|
"remember",
|
|
@@ -129,18 +129,6 @@
|
|
|
129
129
|
page_param: from
|
|
130
130
|
page_size: 10
|
|
131
131
|
max_pages: 8
|
|
132
|
-
- name: Advanced Space
|
|
133
|
-
platform: greenhouse
|
|
134
|
-
slug: advancedspace
|
|
135
|
-
source_of_record: discover
|
|
136
|
-
last_verified: 2026-09-01
|
|
137
|
-
notes: '2026-09-01: verified 18 postings including 2027 DevOps and Fall internships.'
|
|
138
|
-
- name: Audax Group
|
|
139
|
-
platform: greenhouse
|
|
140
|
-
slug: audaxgroup
|
|
141
|
-
source_of_record: discover
|
|
142
|
-
last_verified: 2026-09-01
|
|
143
|
-
notes: '2026-09-01: verified 16 postings including an AI Engineer Co-Op in Boston.'
|
|
144
132
|
- name: Adaption Labs
|
|
145
133
|
platform: ashby
|
|
146
134
|
slug: adaption
|
|
@@ -181,6 +169,12 @@
|
|
|
181
169
|
workday_dc: wd3
|
|
182
170
|
notes: '2026-08-14: verified by a real sync — this board returned postings, which
|
|
183
171
|
is the only verification a Workday tenant can have without an offline probe'
|
|
172
|
+
- name: Advanced Space
|
|
173
|
+
platform: greenhouse
|
|
174
|
+
slug: advancedspace
|
|
175
|
+
source_of_record: discover
|
|
176
|
+
last_verified: 2026-09-01
|
|
177
|
+
notes: '2026-09-01: verified 18 postings including 2027 DevOps and Fall internships.'
|
|
184
178
|
- name: Advanced Systems Group, LLC
|
|
185
179
|
platform: jobvite
|
|
186
180
|
slug: asgllc
|
|
@@ -447,6 +441,14 @@
|
|
|
447
441
|
slug: alixpartners
|
|
448
442
|
source_of_record: discover
|
|
449
443
|
last_verified: *id008
|
|
444
|
+
- name: Allegheny County
|
|
445
|
+
platform: bamboohr
|
|
446
|
+
slug: alleghenycounty
|
|
447
|
+
source_of_record: discover
|
|
448
|
+
last_verified: 2026-08-26
|
|
449
|
+
name_gate_exempt: true
|
|
450
|
+
notes: '2026-08-26: token from this employer''s own apply URL, not slug guessing;
|
|
451
|
+
bamboohr publishes no board name, so provenance is the evidence (15 job(s))'
|
|
450
452
|
- name: Alpha Sense
|
|
451
453
|
platform: greenhouse
|
|
452
454
|
slug: alphasense
|
|
@@ -540,12 +542,6 @@
|
|
|
540
542
|
page_param: offset
|
|
541
543
|
page_size: 100
|
|
542
544
|
max_pages: 10
|
|
543
|
-
- name: American Institutes for Research
|
|
544
|
-
platform: greenhouse
|
|
545
|
-
slug: americaninstitutesforresearch
|
|
546
|
-
source_of_record: discover
|
|
547
|
-
last_verified: 2026-09-01
|
|
548
|
-
notes: '2026-09-01: verified 14 postings including a Data Science Associate Intern.'
|
|
549
545
|
- name: Ambarella
|
|
550
546
|
platform: workday
|
|
551
547
|
slug: ambarella
|
|
@@ -564,6 +560,14 @@
|
|
|
564
560
|
enabled: false
|
|
565
561
|
notes: '2026-08-21: re-checked on the server-rendered board as well; the tenant
|
|
566
562
|
answers but renders no jv-job-list table, so it is an empty or retired board'
|
|
563
|
+
- name: Ambrook
|
|
564
|
+
platform: ashby
|
|
565
|
+
slug: ambrook
|
|
566
|
+
source_of_record: discover
|
|
567
|
+
last_verified: 2026-08-26
|
|
568
|
+
name_gate_exempt: true
|
|
569
|
+
notes: '2026-08-26: token from this employer''s own apply URL, not slug guessing;
|
|
570
|
+
ashby publishes no board name, so provenance is the evidence (15 job(s))'
|
|
567
571
|
- name: Amcor
|
|
568
572
|
platform: workday
|
|
569
573
|
slug: amcor
|
|
@@ -657,6 +661,12 @@
|
|
|
657
661
|
workday_dc: wd5
|
|
658
662
|
notes: '2026-08-14: verified by a real sync — this board returned postings, which
|
|
659
663
|
is the only verification a Workday tenant can have without an offline probe'
|
|
664
|
+
- name: American Institutes for Research
|
|
665
|
+
platform: greenhouse
|
|
666
|
+
slug: americaninstitutesforresearch
|
|
667
|
+
source_of_record: discover
|
|
668
|
+
last_verified: 2026-09-01
|
|
669
|
+
notes: '2026-09-01: verified 14 postings including a Data Science Associate Intern.'
|
|
660
670
|
- name: AmerisourceBergen
|
|
661
671
|
platform: workday
|
|
662
672
|
slug: myhrabc
|
|
@@ -1180,6 +1190,12 @@
|
|
|
1180
1190
|
notes: '2026-08-14: board token taken from this employer''s own application URL
|
|
1181
1191
|
in a feed posting, not from slug guessing; ashby publishes no board name, so the
|
|
1182
1192
|
name gate cannot confirm it and provenance is the evidence (12 job(s))'
|
|
1193
|
+
- name: Audax Group
|
|
1194
|
+
platform: greenhouse
|
|
1195
|
+
slug: audaxgroup
|
|
1196
|
+
source_of_record: discover
|
|
1197
|
+
last_verified: 2026-09-01
|
|
1198
|
+
notes: '2026-09-01: verified 16 postings including an AI Engineer Co-Op in Boston.'
|
|
1183
1199
|
- name: Augsburg University
|
|
1184
1200
|
platform: smartrecruiters
|
|
1185
1201
|
slug: augsburguniversity-minneapolismn
|
|
@@ -1245,6 +1261,13 @@
|
|
|
1245
1261
|
workday_facet: workerSubType:136d83bad7ee010fa71a0c95bf002201
|
|
1246
1262
|
notes: '2026-08-13: official Workday endpoint verified; its Intern fixed-term facet
|
|
1247
1263
|
has 28 listings.'
|
|
1264
|
+
- name: Avery Dennison
|
|
1265
|
+
platform: smartrecruiters
|
|
1266
|
+
slug: averydennison
|
|
1267
|
+
source_of_record: discover
|
|
1268
|
+
last_verified: 2026-08-26
|
|
1269
|
+
notes: '2026-08-26: adopted from feed postings; smartrecruiters/averydennison named
|
|
1270
|
+
itself with 433 jobs.'
|
|
1248
1271
|
- name: Awetomaton
|
|
1249
1272
|
platform: greenhouse
|
|
1250
1273
|
slug: awetomaton
|
|
@@ -416,14 +416,6 @@
|
|
|
416
416
|
workday_dc: wd3
|
|
417
417
|
notes: '2026-08-14: verified by a real sync — this board returned postings, which
|
|
418
418
|
is the only verification a Workday tenant can have without an offline probe'
|
|
419
|
-
- name: BNY
|
|
420
|
-
platform: oracle_cloud
|
|
421
|
-
slug: eofe
|
|
422
|
-
source_of_record: discover
|
|
423
|
-
last_verified: 2026-09-01
|
|
424
|
-
oracle_host: eofe.fa.us2.oraclecloud.com
|
|
425
|
-
oracle_site: BNY-Careers
|
|
426
|
-
notes: '2026-09-01: verified 1401 postings on the Oracle Cloud candidate endpoint.'
|
|
427
419
|
- name: Black Bery
|
|
428
420
|
platform: workday
|
|
429
421
|
slug: bb
|
|
@@ -618,6 +610,14 @@
|
|
|
618
610
|
fields:
|
|
619
611
|
title: title
|
|
620
612
|
id: id
|
|
613
|
+
- name: BNY
|
|
614
|
+
platform: oracle_cloud
|
|
615
|
+
slug: eofe
|
|
616
|
+
source_of_record: discover
|
|
617
|
+
last_verified: 2026-09-01
|
|
618
|
+
oracle_host: eofe.fa.us2.oraclecloud.com
|
|
619
|
+
oracle_site: BNY-Careers
|
|
620
|
+
notes: '2026-09-01: verified 1401 postings on the Oracle Cloud candidate endpoint.'
|
|
621
621
|
- name: Boeing
|
|
622
622
|
platform: workday
|
|
623
623
|
slug: boeing
|
|
@@ -857,6 +857,13 @@
|
|
|
857
857
|
workday_dc: wd3
|
|
858
858
|
notes: '2026-08-17: found by a plain-HTTP scan of the employer''s own careers page
|
|
859
859
|
for a known ATS hostname, no browser and one request per host.'
|
|
860
|
+
- name: BTI360
|
|
861
|
+
platform: greenhouse
|
|
862
|
+
slug: bti36021
|
|
863
|
+
source_of_record: discover
|
|
864
|
+
last_verified: 2026-08-26
|
|
865
|
+
notes: '2026-08-26: adopted from feed postings; greenhouse/bti36021 named itself
|
|
866
|
+
with 13 jobs.'
|
|
860
867
|
- name: Buckman
|
|
861
868
|
platform: smartrecruiters
|
|
862
869
|
slug: buckman
|
|
@@ -241,6 +241,14 @@
|
|
|
241
241
|
enabled: false
|
|
242
242
|
notes: '2026-08-20: re-checked tenant-wide; the CXS jobs endpoint still answers
|
|
243
243
|
422 for this site, so the closed-contract verdict stands on a fresh measurement.'
|
|
244
|
+
- name: Catalist
|
|
245
|
+
platform: lever
|
|
246
|
+
slug: catalist
|
|
247
|
+
source_of_record: discover
|
|
248
|
+
last_verified: 2026-08-26
|
|
249
|
+
name_gate_exempt: true
|
|
250
|
+
notes: '2026-08-26: token from this employer''s own apply URL, not slug guessing;
|
|
251
|
+
lever publishes no board name, so provenance is the evidence (5 job(s))'
|
|
244
252
|
- name: Caterpillar Inc.
|
|
245
253
|
platform: workday
|
|
246
254
|
slug: cat
|
|
@@ -824,12 +832,12 @@
|
|
|
824
832
|
source_of_record: discover
|
|
825
833
|
last_verified: *id009
|
|
826
834
|
- name: ClickHouse
|
|
827
|
-
platform:
|
|
835
|
+
platform: ashby
|
|
828
836
|
slug: clickhouse
|
|
829
837
|
source_of_record: discover
|
|
830
|
-
last_verified: 2026-
|
|
831
|
-
notes: '2026-
|
|
832
|
-
|
|
838
|
+
last_verified: 2026-09-03
|
|
839
|
+
notes: '2026-09-03: moved off greenhouse, which now answers 404 for this slug; the
|
|
840
|
+
ashby board under the same slug returned 177 postings on a live probe'
|
|
833
841
|
- name: Clinical Ink
|
|
834
842
|
platform: smartrecruiters
|
|
835
843
|
slug: clinicalink
|
|
@@ -865,6 +873,13 @@
|
|
|
865
873
|
notes: '2026-08-14: board token taken from this employer''s own application URL
|
|
866
874
|
in a feed posting, not from slug guessing; lever publishes no board name, so the
|
|
867
875
|
name gate cannot confirm it and provenance is the evidence (7 job(s))'
|
|
876
|
+
- name: CloudSEK
|
|
877
|
+
platform: greenhouse
|
|
878
|
+
slug: cloudsek
|
|
879
|
+
source_of_record: discover
|
|
880
|
+
last_verified: 2026-08-26
|
|
881
|
+
notes: '2026-08-26: adopted from feed postings; greenhouse/cloudsek named itself
|
|
882
|
+
with 13 jobs.'
|
|
868
883
|
- name: CME Group
|
|
869
884
|
platform: workday
|
|
870
885
|
slug: cmegroup
|
|
@@ -935,12 +950,6 @@
|
|
|
935
950
|
workday_dc: wd5
|
|
936
951
|
notes: '2026-08-16: coordinates taken from this employer''s own apply URL, then
|
|
937
952
|
verified by a scratch sync (4 posting(s), 0 kept)'
|
|
938
|
-
- name: Compeer Financial
|
|
939
|
-
platform: greenhouse
|
|
940
|
-
slug: compeerfinancial
|
|
941
|
-
source_of_record: discover
|
|
942
|
-
last_verified: 2026-09-01
|
|
943
|
-
notes: '2026-09-01: verified 48 postings across WI, IL and MN.'
|
|
944
953
|
- name: Co Active Systems
|
|
945
954
|
platform: greenhouse
|
|
946
955
|
slug: coactivesystems
|
|
@@ -1038,6 +1047,12 @@
|
|
|
1038
1047
|
name_gate_exempt: true
|
|
1039
1048
|
notes: '2026-08-20: the owner supplied this exact lever board URL, which is the
|
|
1040
1049
|
provenance lever cannot give because it publishes no board name; 66 postings.'
|
|
1050
|
+
- name: Compeer Financial
|
|
1051
|
+
platform: greenhouse
|
|
1052
|
+
slug: compeerfinancial
|
|
1053
|
+
source_of_record: discover
|
|
1054
|
+
last_verified: 2026-09-01
|
|
1055
|
+
notes: '2026-09-01: verified 48 postings across WI, IL and MN.'
|
|
1041
1056
|
- name: Composio
|
|
1042
1057
|
platform: ashby
|
|
1043
1058
|
slug: composio
|
|
@@ -1056,6 +1071,13 @@
|
|
|
1056
1071
|
notes: '2026-08-18: the human check this row was waiting for is done - the owner
|
|
1057
1072
|
supplied compulsiongames.bamboohr.com/careers directly, which is the employer
|
|
1058
1073
|
own board.'
|
|
1074
|
+
- name: Concentric
|
|
1075
|
+
platform: greenhouse
|
|
1076
|
+
slug: concentric
|
|
1077
|
+
source_of_record: discover
|
|
1078
|
+
last_verified: 2026-08-26
|
|
1079
|
+
notes: '2026-08-26: adopted from feed postings; greenhouse/concentric named itself
|
|
1080
|
+
with 11 jobs.'
|
|
1059
1081
|
- name: Confluent
|
|
1060
1082
|
platform: ashby
|
|
1061
1083
|
slug: confluent
|
|
@@ -220,6 +220,13 @@
|
|
|
220
220
|
workday_dc: wd10
|
|
221
221
|
notes: '2026-08-16: un-parked with the rest of the tenant — the 2026-08-11 budget
|
|
222
222
|
reason expired when the Workday ceiling went 120 to 732'
|
|
223
|
+
- name: Detroit Lions
|
|
224
|
+
platform: greenhouse
|
|
225
|
+
slug: detroitlions
|
|
226
|
+
source_of_record: discover
|
|
227
|
+
last_verified: 2026-08-26
|
|
228
|
+
notes: '2026-08-26: adopted from feed postings; greenhouse/detroitlions named itself
|
|
229
|
+
with 8 jobs.'
|
|
223
230
|
- name: DEUNA
|
|
224
231
|
platform: lever
|
|
225
232
|
slug: deuna
|
|
@@ -6,6 +6,14 @@
|
|
|
6
6
|
notes: '2026-08-16: adopted from this employer''s own apply URL, then paused to
|
|
7
7
|
match the rest of the workable platform, which is parked until 2026-08-18 after
|
|
8
8
|
two 429s in one day.'
|
|
9
|
+
- name: E-Space
|
|
10
|
+
platform: lever
|
|
11
|
+
slug: espace
|
|
12
|
+
source_of_record: discover
|
|
13
|
+
last_verified: 2026-08-26
|
|
14
|
+
name_gate_exempt: true
|
|
15
|
+
notes: '2026-08-26: token from this employer''s own apply URL, not slug guessing;
|
|
16
|
+
lever publishes no board name, so provenance is the evidence (145 job(s))'
|
|
9
17
|
- name: East Penn Manufacturing Company
|
|
10
18
|
platform: custom_json
|
|
11
19
|
slug: eastpennmanufacturing
|
|
@@ -207,6 +215,13 @@
|
|
|
207
215
|
slug: ensemble
|
|
208
216
|
source_of_record: discover
|
|
209
217
|
last_verified: *id002
|
|
218
|
+
- name: Enterpret
|
|
219
|
+
platform: greenhouse
|
|
220
|
+
slug: enterpret
|
|
221
|
+
source_of_record: discover
|
|
222
|
+
last_verified: 2026-08-26
|
|
223
|
+
notes: '2026-08-26: adopted from feed postings; greenhouse/enterpret named itself
|
|
224
|
+
with 18 jobs.'
|
|
210
225
|
- name: Enverus
|
|
211
226
|
platform: jobvite
|
|
212
227
|
slug: drillinginfo
|
|
@@ -408,6 +423,13 @@
|
|
|
408
423
|
page_start: 1
|
|
409
424
|
page_step: 1
|
|
410
425
|
max_pages: 5
|
|
426
|
+
- name: Eudia
|
|
427
|
+
platform: greenhouse
|
|
428
|
+
slug: eudia
|
|
429
|
+
source_of_record: discover
|
|
430
|
+
last_verified: 2026-08-26
|
|
431
|
+
notes: '2026-08-26: adopted from feed postings; greenhouse/eudia named itself with
|
|
432
|
+
19 jobs.'
|
|
411
433
|
- name: Eulerity
|
|
412
434
|
platform: greenhouse
|
|
413
435
|
slug: eulerity
|
|
@@ -298,6 +298,13 @@
|
|
|
298
298
|
workday_dc: wd10
|
|
299
299
|
notes: '2026-08-18: found by a plain-HTTP scan of the employer''s own careers page
|
|
300
300
|
for a known ATS hostname, part of the Montreal/Quebec sweep.'
|
|
301
|
+
- name: Fooji
|
|
302
|
+
platform: workable
|
|
303
|
+
slug: fooji
|
|
304
|
+
source_of_record: discover
|
|
305
|
+
last_verified: 2026-08-26
|
|
306
|
+
notes: '2026-08-26: adopted from feed postings; workable/fooji named itself with
|
|
307
|
+
2 jobs.'
|
|
301
308
|
- name: Ford Motor
|
|
302
309
|
platform: custom_json
|
|
303
310
|
slug: ford
|
|
@@ -436,6 +443,14 @@
|
|
|
436
443
|
last_verified: *id008
|
|
437
444
|
notes: '2026-08-11: enabled on slug evidence - bamboohr publishes no board name,
|
|
438
445
|
but the slug folds to the caption and the board returned 13 job(s)'
|
|
446
|
+
- name: Fullbay
|
|
447
|
+
platform: bamboohr
|
|
448
|
+
slug: fullbay
|
|
449
|
+
source_of_record: discover
|
|
450
|
+
last_verified: 2026-08-26
|
|
451
|
+
name_gate_exempt: true
|
|
452
|
+
notes: '2026-08-26: token from this employer''s own apply URL, not slug guessing;
|
|
453
|
+
bamboohr publishes no board name, so provenance is the evidence (11 job(s))'
|
|
439
454
|
- name: Fundwell
|
|
440
455
|
platform: ashby
|
|
441
456
|
slug: fundwell
|
|
@@ -20,6 +20,13 @@
|
|
|
20
20
|
slug: gameloft
|
|
21
21
|
source_of_record: openjobs
|
|
22
22
|
last_verified: &id008 2026-08-14
|
|
23
|
+
- name: Garda Capital Partners
|
|
24
|
+
platform: greenhouse
|
|
25
|
+
slug: gardacp
|
|
26
|
+
source_of_record: discover
|
|
27
|
+
last_verified: 2026-08-26
|
|
28
|
+
notes: '2026-08-26: adopted from feed postings; greenhouse/gardacp named itself
|
|
29
|
+
with 11 jobs.'
|
|
23
30
|
- name: Gardens Interactive
|
|
24
31
|
platform: ashby
|
|
25
32
|
slug: gardens
|
|
@@ -155,13 +162,6 @@
|
|
|
155
162
|
workday_dc: wd5
|
|
156
163
|
notes: '2026-08-14: verified by a real sync — this board returned postings, which
|
|
157
164
|
is the only verification a Workday tenant can have without an offline probe'
|
|
158
|
-
- name: General Matter
|
|
159
|
-
platform: greenhouse
|
|
160
|
-
slug: generalmatter
|
|
161
|
-
source_of_record: discover
|
|
162
|
-
last_verified: 2026-09-01
|
|
163
|
-
notes: '2026-09-01: verified 115 postings including a Summer 2027 Software Engineering
|
|
164
|
-
internship in Los Angeles.'
|
|
165
165
|
- name: General Dynamics Information Technology
|
|
166
166
|
platform: workday
|
|
167
167
|
slug: gdit
|
|
@@ -196,6 +196,13 @@
|
|
|
196
196
|
notes: '2026-08-14: board token taken from this employer''s own application URL
|
|
197
197
|
in a feed posting, not from slug guessing; ashby publishes no board name, so the
|
|
198
198
|
name gate cannot confirm it and provenance is the evidence (13 job(s))'
|
|
199
|
+
- name: General Matter
|
|
200
|
+
platform: greenhouse
|
|
201
|
+
slug: generalmatter
|
|
202
|
+
source_of_record: discover
|
|
203
|
+
last_verified: 2026-09-01
|
|
204
|
+
notes: '2026-09-01: verified 115 postings including a Summer 2027 Software Engineering
|
|
205
|
+
internship in Los Angeles.'
|
|
199
206
|
- name: General Motors
|
|
200
207
|
platform: custom_json
|
|
201
208
|
slug: gm
|
|
@@ -407,11 +414,13 @@
|
|
|
407
414
|
- name: Gloss Genius
|
|
408
415
|
platform: greenhouse
|
|
409
416
|
slug: glossgenius
|
|
417
|
+
enabled: false
|
|
410
418
|
source_of_record: openjobs
|
|
411
419
|
last_verified: *id006
|
|
412
420
|
name_gate_exempt: true
|
|
413
|
-
notes: '2026-
|
|
414
|
-
|
|
421
|
+
notes: '2026-09-03: disabled — greenhouse answers 404 for this slug and no ashby or
|
|
422
|
+
lever board carries it. 2026-08-08: the board published the name ''Genius AI'',
|
|
423
|
+
which the name gate rejects.'
|
|
415
424
|
- name: GOAT Group
|
|
416
425
|
platform: greenhouse
|
|
417
426
|
slug: goatgroup
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
- name: H3X Technologies
|
|
2
|
+
platform: ashby
|
|
3
|
+
slug: h3x-technologies
|
|
4
|
+
source_of_record: discover
|
|
5
|
+
last_verified: 2026-08-26
|
|
6
|
+
name_gate_exempt: true
|
|
7
|
+
notes: '2026-08-26: token from this employer''s own apply URL, not slug guessing;
|
|
8
|
+
ashby publishes no board name, so provenance is the evidence (13 job(s))'
|
|
1
9
|
- name: Haize Labs
|
|
2
10
|
platform: greenhouse
|
|
3
11
|
slug: haizelabs
|
|
@@ -284,6 +284,13 @@
|
|
|
284
284
|
slug: instalilyai
|
|
285
285
|
source_of_record: discover
|
|
286
286
|
last_verified: *id002
|
|
287
|
+
- name: Instawork
|
|
288
|
+
platform: greenhouse
|
|
289
|
+
slug: instawork
|
|
290
|
+
source_of_record: discover
|
|
291
|
+
last_verified: 2026-08-26
|
|
292
|
+
notes: '2026-08-26: adopted from feed postings; greenhouse/instawork named itself
|
|
293
|
+
with 53 jobs.'
|
|
287
294
|
- name: Instead
|
|
288
295
|
platform: greenhouse
|
|
289
296
|
slug: instead
|
|
@@ -136,3 +136,10 @@
|
|
|
136
136
|
slug: jumptrading
|
|
137
137
|
source_of_record: discover
|
|
138
138
|
last_verified: *id003
|
|
139
|
+
- name: Juvare
|
|
140
|
+
platform: greenhouse
|
|
141
|
+
slug: juvare
|
|
142
|
+
source_of_record: discover
|
|
143
|
+
last_verified: 2026-08-26
|
|
144
|
+
notes: '2026-08-26: adopted from feed postings; greenhouse/juvare named itself with
|
|
145
|
+
2 jobs.'
|