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.
Files changed (294) hide show
  1. {stage_cli-1.0.0 → stage_cli-1.1.0}/CHANGELOG.md +29 -1
  2. {stage_cli-1.0.0 → stage_cli-1.1.0}/PKG-INFO +4 -4
  3. {stage_cli-1.0.0 → stage_cli-1.1.0}/README.md +3 -3
  4. {stage_cli-1.0.0 → stage_cli-1.1.0}/SECURITY.md +8 -5
  5. {stage_cli-1.0.0 → stage_cli-1.1.0}/assets/ci-flow.svg +1 -1
  6. stage_cli-1.1.0/src/stage/__init__.py +1 -0
  7. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/commands/pipeline.py +3 -2
  8. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/notify.py +13 -0
  9. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/a.yaml +41 -18
  10. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/b.yaml +15 -8
  11. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/c.yaml +32 -10
  12. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/d.yaml +7 -0
  13. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/e.yaml +22 -0
  14. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/f.yaml +15 -0
  15. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/g.yaml +18 -9
  16. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/h.yaml +8 -0
  17. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/i.yaml +7 -0
  18. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/j.yaml +7 -0
  19. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/m.yaml +27 -2
  20. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/n.yaml +24 -0
  21. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/p.yaml +45 -16
  22. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/q.yaml +8 -0
  23. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/r.yaml +15 -0
  24. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/s.yaml +63 -5
  25. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/t.yaml +7 -0
  26. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/u.yaml +12 -4
  27. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/v.yaml +4 -3
  28. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/w.yaml +21 -6
  29. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/z.yaml +14 -6
  30. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/screens/postings.py +6 -3
  31. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/state.py +1 -1
  32. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_notify.py +73 -0
  33. stage_cli-1.0.0/src/stage/__init__.py +0 -1
  34. {stage_cli-1.0.0 → stage_cli-1.1.0}/.gitattributes +0 -0
  35. {stage_cli-1.0.0 → stage_cli-1.1.0}/.gitignore +0 -0
  36. {stage_cli-1.0.0 → stage_cli-1.1.0}/.python-version +0 -0
  37. {stage_cli-1.0.0 → stage_cli-1.1.0}/LICENSE +0 -0
  38. {stage_cli-1.0.0 → stage_cli-1.1.0}/assets/cli.png +0 -0
  39. {stage_cli-1.0.0 → stage_cli-1.1.0}/assets/tui.png +0 -0
  40. {stage_cli-1.0.0 → stage_cli-1.1.0}/pyproject.toml +0 -0
  41. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/__main__.py +0 -0
  42. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/banner.py +0 -0
  43. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/bootstrap/__init__.py +0 -0
  44. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/bootstrap/openjobs.py +0 -0
  45. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/classify/__init__.py +0 -0
  46. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/classify/eligibility.py +0 -0
  47. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/classify/internship.py +0 -0
  48. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/classify/role.py +0 -0
  49. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/classify/scope.py +0 -0
  50. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/__init__.py +0 -0
  51. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/app.py +0 -0
  52. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/commands/__init__.py +0 -0
  53. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/commands/discovery.py +0 -0
  54. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/commands/insight.py +0 -0
  55. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/commands/postings.py +0 -0
  56. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/commands/schedule.py +0 -0
  57. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/housekeeping.py +0 -0
  58. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/logfile.py +0 -0
  59. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/options.py +0 -0
  60. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/render.py +0 -0
  61. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/runlock.py +0 -0
  62. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/schedule.py +0 -0
  63. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/schedule_state.py +0 -0
  64. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/selection.py +0 -0
  65. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/cli/serialize.py +0 -0
  66. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/companies.py +0 -0
  67. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/k.yaml +0 -0
  68. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/l.yaml +0 -0
  69. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/o.yaml +0 -0
  70. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/other.yaml +0 -0
  71. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/x.yaml +0 -0
  72. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/companies/y.yaml +0 -0
  73. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/fonts/DejaVuSans.LICENSE.txt +0 -0
  74. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/fonts/DejaVuSans.ttf +0 -0
  75. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/company_tokens.yaml +0 -0
  76. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/eligibility.yaml +0 -0
  77. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/inclusive_suffixes.yaml +0 -0
  78. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/internship.yaml +0 -0
  79. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/language.yaml +0 -0
  80. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/locations.yaml +0 -0
  81. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/roles.yaml +0 -0
  82. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/terms.yaml +0 -0
  83. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/lexicon/workday_facets.yaml +0 -0
  84. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/data/seed_companies.yaml +0 -0
  85. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/dedup/__init__.py +0 -0
  86. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/dedup/identity.py +0 -0
  87. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/dedup/resolve.py +0 -0
  88. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/__init__.py +0 -0
  89. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/company.py +0 -0
  90. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/coverage.py +0 -0
  91. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/custom_board.py +0 -0
  92. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/discovery.py +0 -0
  93. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/enums.py +0 -0
  94. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/events.py +0 -0
  95. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/filters.py +0 -0
  96. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/health.py +0 -0
  97. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/ids.py +0 -0
  98. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/job.py +0 -0
  99. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/matching.py +0 -0
  100. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/priority.py +0 -0
  101. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/quarantine.py +0 -0
  102. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/rate_state.py +0 -0
  103. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/retention.py +0 -0
  104. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/rotation.py +0 -0
  105. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/signals.py +0 -0
  106. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/sync_run.py +0 -0
  107. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/text.py +0 -0
  108. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/validator.py +0 -0
  109. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/visits.py +0 -0
  110. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/domain/workday.py +0 -0
  111. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/http/__init__.py +0 -0
  112. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/http/breaker.py +0 -0
  113. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/http/cache.py +0 -0
  114. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/http/client.py +0 -0
  115. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/http/profiles.py +0 -0
  116. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/lexicon.py +0 -0
  117. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/normalize/__init__.py +0 -0
  118. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/normalize/language.py +0 -0
  119. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/normalize/location.py +0 -0
  120. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/normalize/terms.py +0 -0
  121. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/normalize/urls.py +0 -0
  122. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/paths.py +0 -0
  123. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/py.typed +0 -0
  124. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/__init__.py +0 -0
  125. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/canary.py +0 -0
  126. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/coverage.py +0 -0
  127. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/discover.py +0 -0
  128. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/export.py +0 -0
  129. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/health.py +0 -0
  130. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/maintenance.py +0 -0
  131. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/quarantine.py +0 -0
  132. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/query.py +0 -0
  133. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/services/sync.py +0 -0
  134. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/__init__.py +0 -0
  135. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/_text.py +0 -0
  136. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/ashby.py +0 -0
  137. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/bamboohr.py +0 -0
  138. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/base.py +0 -0
  139. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/breezy.py +0 -0
  140. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/collage.py +0 -0
  141. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/community_feeds.py +0 -0
  142. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/curated_markdown.py +0 -0
  143. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/custom_json.py +0 -0
  144. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/espresso.py +0 -0
  145. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/feed.py +0 -0
  146. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/greenhouse.py +0 -0
  147. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/jobbank.py +0 -0
  148. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/jobvite.py +0 -0
  149. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/lever.py +0 -0
  150. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/oracle_cloud.py +0 -0
  151. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/platforms.py +0 -0
  152. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/quebec_emploi.py +0 -0
  153. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/recruitee.py +0 -0
  154. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/simplify.py +0 -0
  155. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/smartrecruiters.py +0 -0
  156. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/speedyapply.py +0 -0
  157. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/themuse.py +0 -0
  158. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/workable.py +0 -0
  159. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/workday.py +0 -0
  160. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/sources/zshah.py +0 -0
  161. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/storage/__init__.py +0 -0
  162. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/storage/migrations/0001_initial.sql +0 -0
  163. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/storage/migrations/__init__.py +0 -0
  164. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/storage/repository.py +0 -0
  165. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/storage/search.py +0 -0
  166. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/storage/sqlite_repo.py +0 -0
  167. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/storage/writer.py +0 -0
  168. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/__init__.py +0 -0
  169. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/app.py +0 -0
  170. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/help.py +0 -0
  171. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/safe.py +0 -0
  172. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/screens/__init__.py +0 -0
  173. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/screens/boards.py +0 -0
  174. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/screens/review.py +0 -0
  175. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/screens/splash.py +0 -0
  176. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/screens/stats.py +0 -0
  177. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/screens/sync.py +0 -0
  178. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/theme.tcss +0 -0
  179. {stage_cli-1.0.0 → stage_cli-1.1.0}/src/stage/tui/widgets/__init__.py +0 -0
  180. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/conftest.py +0 -0
  181. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/bilingual_titles.json +0 -0
  182. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/blackrock_search.html +0 -0
  183. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/croesus_career.html +0 -0
  184. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/disney_search.html +0 -0
  185. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/ea_searchjobs.html +0 -0
  186. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/espresso_search.html +0 -0
  187. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/gildan_openpositions.html +0 -0
  188. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/greenhouse_jobs.json +0 -0
  189. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/jobbank_search.html +0 -0
  190. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/jobvite_agscareer.html +0 -0
  191. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/jobvite_resolver.html +0 -0
  192. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/l3harris_search.html +0 -0
  193. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/lightspeed_openings.html +0 -0
  194. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/loblaw_jobs.html +0 -0
  195. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/nbc_search.html +0 -0
  196. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/parsons_search.html +0 -0
  197. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/publicissapient_sitemap.html +0 -0
  198. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/rentec_careers.html +0 -0
  199. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/sega_vacancies.html +0 -0
  200. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/sfrmk_search.html +0 -0
  201. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/shopify_internships.html +0 -0
  202. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/fixtures/twosigma_openroles.html +0 -0
  203. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/golden/classification.json +0 -0
  204. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_adapter_salvage.py +0 -0
  205. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_adopt_unregistered.py +0 -0
  206. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_board_identity.py +0 -0
  207. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_board_rest.py +0 -0
  208. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_canary.py +0 -0
  209. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_canary_events.py +0 -0
  210. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_classify.py +0 -0
  211. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_cli_help.py +0 -0
  212. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_cli_options.py +0 -0
  213. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_collage_adapter.py +0 -0
  214. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_companies_registry.py +0 -0
  215. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_company_fold_key.py +0 -0
  216. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_coverage.py +0 -0
  217. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_curated_markdown.py +0 -0
  218. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_custom_json.py +0 -0
  219. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_custom_json_buckets.py +0 -0
  220. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_custom_json_formats.py +0 -0
  221. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_custom_json_pagination.py +0 -0
  222. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_dedup.py +0 -0
  223. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_degree_and_disciplines.py +0 -0
  224. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_detail_queue.py +0 -0
  225. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_discover.py +0 -0
  226. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_eligibility.py +0 -0
  227. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_export.py +0 -0
  228. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_feed_adapters.py +0 -0
  229. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_feeds.py +0 -0
  230. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_fetch_authority.py +0 -0
  231. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_fold_inclusive.py +0 -0
  232. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_golden.py +0 -0
  233. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_greenhouse_adapter.py +0 -0
  234. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_health.py +0 -0
  235. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_housekeeping.py +0 -0
  236. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_html_boards.py +0 -0
  237. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_html_text.py +0 -0
  238. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_http_akamai.py +0 -0
  239. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_http_client.py +0 -0
  240. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_http_conditional.py +0 -0
  241. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_http_resilience.py +0 -0
  242. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_integrity_repair.py +0 -0
  243. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_jobvite_adapter.py +0 -0
  244. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_language.py +0 -0
  245. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_layering.py +0 -0
  246. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_lever_adapter.py +0 -0
  247. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_lexicon.py +0 -0
  248. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_location.py +0 -0
  249. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_malformed_input.py +0 -0
  250. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_migrations.py +0 -0
  251. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_new_adapters.py +0 -0
  252. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_openjobs_crossref.py +0 -0
  253. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_oracle_cloud_adapter.py +0 -0
  254. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_paths.py +0 -0
  255. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_permissions.py +0 -0
  256. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_platform_shapes.py +0 -0
  257. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_profiles.py +0 -0
  258. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_quarantine.py +0 -0
  259. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_quarantine_relabel.py +0 -0
  260. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_quebec_emploi.py +0 -0
  261. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_rate_state.py +0 -0
  262. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_recall_limits.py +0 -0
  263. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_recheck.py +0 -0
  264. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_registry_shards.py +0 -0
  265. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_render.py +0 -0
  266. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_request_log.py +0 -0
  267. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_rescreen.py +0 -0
  268. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_review_contradictions.py +0 -0
  269. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_rotation.py +0 -0
  270. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_run_budget.py +0 -0
  271. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_schedule.py +0 -0
  272. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_schedule_state.py +0 -0
  273. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_schema_baseline.py +0 -0
  274. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_search.py +0 -0
  275. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_serialize.py +0 -0
  276. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_show.py +0 -0
  277. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_signals_persist.py +0 -0
  278. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_smartrecruiters_adapter.py +0 -0
  279. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_speedyapply.py +0 -0
  280. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_startup_budget.py +0 -0
  281. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_sync_e2e.py +0 -0
  282. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_sync_shape.py +0 -0
  283. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_sync_step2.py +0 -0
  284. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_terms.py +0 -0
  285. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_tombstones.py +0 -0
  286. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_tui.py +0 -0
  287. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_unregistered_quarantine.py +0 -0
  288. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_untrusted_display.py +0 -0
  289. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_update_badges.py +0 -0
  290. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_verify_registry.py +0 -0
  291. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_workday_adapter.py +0 -0
  292. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_workday_urls.py +0 -0
  293. {stage_cli-1.0.0 → stage_cli-1.1.0}/tests/test_writer.py +0 -0
  294. {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,487 employers** across 15 ATS platforms — Greenhouse, Lever, Ashby,
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.0.0
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
  ![python](https://img.shields.io/static/v1?label=python&message=3.12%20%7C%203.13%20%7C%203.14&color=4a9eff&logo=python&logoColor=white)
61
61
 
62
- ![tests](https://img.shields.io/static/v1?label=tests&message=2%2C375&color=44bb00) ![coverage](https://img.shields.io/static/v1?label=coverage&message=89%25&color=44bb00) [![ci](https://img.shields.io/github/actions/workflow/status/NicholasXydis/Stage/ci.yml?branch=main&label=ci&logo=githubactions&logoColor=white)](https://github.com/NicholasXydis/Stage/actions/workflows/ci.yml)
62
+ ![tests](https://img.shields.io/static/v1?label=tests&message=2%2C381&color=44bb00) ![coverage](https://img.shields.io/static/v1?label=coverage&message=89%25&color=44bb00) [![ci](https://img.shields.io/github/actions/workflow/status/NicholasXydis/Stage/ci.yml?branch=main&label=ci&logo=githubactions&logoColor=white)](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,375 tests, 89% branch coverage
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,375 tests, coverage floor, badge drift |
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
  ![python](https://img.shields.io/static/v1?label=python&message=3.12%20%7C%203.13%20%7C%203.14&color=4a9eff&logo=python&logoColor=white)
22
22
 
23
- ![tests](https://img.shields.io/static/v1?label=tests&message=2%2C375&color=44bb00) ![coverage](https://img.shields.io/static/v1?label=coverage&message=89%25&color=44bb00) [![ci](https://img.shields.io/github/actions/workflow/status/NicholasXydis/Stage/ci.yml?branch=main&label=ci&logo=githubactions&logoColor=white)](https://github.com/NicholasXydis/Stage/actions/workflows/ci.yml)
23
+ ![tests](https://img.shields.io/static/v1?label=tests&message=2%2C381&color=44bb00) ![coverage](https://img.shields.io/static/v1?label=coverage&message=89%25&color=44bb00) [![ci](https://img.shields.io/github/actions/workflow/status/NicholasXydis/Stage/ci.yml?branch=main&label=ci&logo=githubactions&logoColor=white)](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,375 tests, 89% branch coverage
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,375 tests, coverage floor, badge drift |
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.0.0 | ✅ |
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, no
46
- authentication, and no API keys — none of the sources it reads require credentials. Postings
47
- are stored in a SQLite database under your own user account, and outbound requests go only to
48
- hosts listed in the registry shipped with the package.
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,375 tests, 89%</text>
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=notify.MAX_LISTED), first_seen_after=since)
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 listing.jobs
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: greenhouse
835
+ platform: ashby
828
836
  slug: clickhouse
829
837
  source_of_record: discover
830
- last_verified: 2026-08-17
831
- notes: '2026-08-17: found by browser-assisted discovery, then verified by a live
832
- probe that matched the company name on the returned board'
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-08-08: board publishes the name ''Genius AI''; the name gate rejects
414
- this caption, and the board is confirmed correct'
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.'