stage-cli 1.0.0__py3-none-any.whl

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 (170) hide show
  1. stage/__init__.py +1 -0
  2. stage/__main__.py +8 -0
  3. stage/banner.py +32 -0
  4. stage/bootstrap/__init__.py +0 -0
  5. stage/bootstrap/openjobs.py +392 -0
  6. stage/classify/__init__.py +29 -0
  7. stage/classify/eligibility.py +115 -0
  8. stage/classify/internship.py +64 -0
  9. stage/classify/role.py +91 -0
  10. stage/classify/scope.py +47 -0
  11. stage/cli/__init__.py +0 -0
  12. stage/cli/app.py +4 -0
  13. stage/cli/commands/__init__.py +8 -0
  14. stage/cli/commands/discovery.py +294 -0
  15. stage/cli/commands/insight.py +494 -0
  16. stage/cli/commands/pipeline.py +337 -0
  17. stage/cli/commands/postings.py +473 -0
  18. stage/cli/commands/schedule.py +171 -0
  19. stage/cli/housekeeping.py +64 -0
  20. stage/cli/logfile.py +56 -0
  21. stage/cli/notify.py +170 -0
  22. stage/cli/options.py +678 -0
  23. stage/cli/render.py +1398 -0
  24. stage/cli/runlock.py +74 -0
  25. stage/cli/schedule.py +702 -0
  26. stage/cli/schedule_state.py +363 -0
  27. stage/cli/selection.py +83 -0
  28. stage/cli/serialize.py +196 -0
  29. stage/companies.py +542 -0
  30. stage/data/companies/a.yaml +1289 -0
  31. stage/data/companies/b.yaml +900 -0
  32. stage/data/companies/c.yaml +1377 -0
  33. stage/data/companies/d.yaml +497 -0
  34. stage/data/companies/e.yaml +519 -0
  35. stage/data/companies/f.yaml +454 -0
  36. stage/data/companies/g.yaml +601 -0
  37. stage/data/companies/h.yaml +446 -0
  38. stage/data/companies/i.yaml +503 -0
  39. stage/data/companies/j.yaml +138 -0
  40. stage/data/companies/k.yaml +278 -0
  41. stage/data/companies/l.yaml +402 -0
  42. stage/data/companies/m.yaml +937 -0
  43. stage/data/companies/n.yaml +549 -0
  44. stage/data/companies/o.yaml +371 -0
  45. stage/data/companies/other.yaml +58 -0
  46. stage/data/companies/p.yaml +825 -0
  47. stage/data/companies/q.yaml +121 -0
  48. stage/data/companies/r.yaml +583 -0
  49. stage/data/companies/s.yaml +1140 -0
  50. stage/data/companies/t.yaml +817 -0
  51. stage/data/companies/u.yaml +196 -0
  52. stage/data/companies/v.yaml +325 -0
  53. stage/data/companies/w.yaml +353 -0
  54. stage/data/companies/x.yaml +67 -0
  55. stage/data/companies/y.yaml +36 -0
  56. stage/data/companies/z.yaml +146 -0
  57. stage/data/fonts/DejaVuSans.LICENSE.txt +99 -0
  58. stage/data/fonts/DejaVuSans.ttf +0 -0
  59. stage/data/lexicon/company_tokens.yaml +228 -0
  60. stage/data/lexicon/eligibility.yaml +455 -0
  61. stage/data/lexicon/inclusive_suffixes.yaml +37 -0
  62. stage/data/lexicon/internship.yaml +187 -0
  63. stage/data/lexicon/language.yaml +226 -0
  64. stage/data/lexicon/locations.yaml +1159 -0
  65. stage/data/lexicon/roles.yaml +2012 -0
  66. stage/data/lexicon/terms.yaml +76 -0
  67. stage/data/lexicon/workday_facets.yaml +27 -0
  68. stage/data/seed_companies.yaml +198 -0
  69. stage/dedup/__init__.py +19 -0
  70. stage/dedup/identity.py +113 -0
  71. stage/dedup/resolve.py +97 -0
  72. stage/domain/__init__.py +244 -0
  73. stage/domain/company.py +49 -0
  74. stage/domain/coverage.py +86 -0
  75. stage/domain/custom_board.py +92 -0
  76. stage/domain/discovery.py +94 -0
  77. stage/domain/enums.py +114 -0
  78. stage/domain/events.py +204 -0
  79. stage/domain/filters.py +27 -0
  80. stage/domain/health.py +169 -0
  81. stage/domain/ids.py +48 -0
  82. stage/domain/job.py +47 -0
  83. stage/domain/matching.py +15 -0
  84. stage/domain/priority.py +34 -0
  85. stage/domain/quarantine.py +39 -0
  86. stage/domain/rate_state.py +78 -0
  87. stage/domain/retention.py +20 -0
  88. stage/domain/rotation.py +46 -0
  89. stage/domain/signals.py +12 -0
  90. stage/domain/sync_run.py +35 -0
  91. stage/domain/text.py +113 -0
  92. stage/domain/validator.py +14 -0
  93. stage/domain/visits.py +60 -0
  94. stage/domain/workday.py +38 -0
  95. stage/http/__init__.py +58 -0
  96. stage/http/breaker.py +53 -0
  97. stage/http/cache.py +44 -0
  98. stage/http/client.py +725 -0
  99. stage/http/profiles.py +101 -0
  100. stage/lexicon.py +370 -0
  101. stage/normalize/__init__.py +16 -0
  102. stage/normalize/language.py +47 -0
  103. stage/normalize/location.py +271 -0
  104. stage/normalize/terms.py +153 -0
  105. stage/normalize/urls.py +122 -0
  106. stage/paths.py +86 -0
  107. stage/py.typed +0 -0
  108. stage/services/__init__.py +0 -0
  109. stage/services/canary.py +120 -0
  110. stage/services/coverage.py +231 -0
  111. stage/services/discover.py +747 -0
  112. stage/services/export.py +274 -0
  113. stage/services/health.py +237 -0
  114. stage/services/maintenance.py +225 -0
  115. stage/services/quarantine.py +20 -0
  116. stage/services/query.py +86 -0
  117. stage/services/sync.py +1257 -0
  118. stage/sources/__init__.py +82 -0
  119. stage/sources/_text.py +79 -0
  120. stage/sources/ashby.py +93 -0
  121. stage/sources/bamboohr.py +80 -0
  122. stage/sources/base.py +225 -0
  123. stage/sources/breezy.py +90 -0
  124. stage/sources/collage.py +60 -0
  125. stage/sources/community_feeds.py +142 -0
  126. stage/sources/curated_markdown.py +289 -0
  127. stage/sources/custom_json.py +610 -0
  128. stage/sources/espresso.py +154 -0
  129. stage/sources/feed.py +44 -0
  130. stage/sources/greenhouse.py +104 -0
  131. stage/sources/jobbank.py +147 -0
  132. stage/sources/jobvite.py +133 -0
  133. stage/sources/lever.py +76 -0
  134. stage/sources/oracle_cloud.py +187 -0
  135. stage/sources/platforms.py +609 -0
  136. stage/sources/quebec_emploi.py +146 -0
  137. stage/sources/recruitee.py +96 -0
  138. stage/sources/simplify.py +110 -0
  139. stage/sources/smartrecruiters.py +216 -0
  140. stage/sources/speedyapply.py +200 -0
  141. stage/sources/themuse.py +157 -0
  142. stage/sources/workable.py +83 -0
  143. stage/sources/workday.py +524 -0
  144. stage/sources/zshah.py +99 -0
  145. stage/storage/__init__.py +29 -0
  146. stage/storage/migrations/0001_initial.sql +239 -0
  147. stage/storage/migrations/__init__.py +135 -0
  148. stage/storage/repository.py +213 -0
  149. stage/storage/search.py +28 -0
  150. stage/storage/sqlite_repo.py +1586 -0
  151. stage/storage/writer.py +249 -0
  152. stage/tui/__init__.py +0 -0
  153. stage/tui/app.py +82 -0
  154. stage/tui/help.py +26 -0
  155. stage/tui/safe.py +21 -0
  156. stage/tui/screens/__init__.py +0 -0
  157. stage/tui/screens/boards.py +186 -0
  158. stage/tui/screens/postings.py +509 -0
  159. stage/tui/screens/review.py +209 -0
  160. stage/tui/screens/splash.py +37 -0
  161. stage/tui/screens/stats.py +124 -0
  162. stage/tui/screens/sync.py +194 -0
  163. stage/tui/state.py +160 -0
  164. stage/tui/theme.tcss +205 -0
  165. stage/tui/widgets/__init__.py +0 -0
  166. stage_cli-1.0.0.dist-info/METADATA +379 -0
  167. stage_cli-1.0.0.dist-info/RECORD +170 -0
  168. stage_cli-1.0.0.dist-info/WHEEL +4 -0
  169. stage_cli-1.0.0.dist-info/entry_points.txt +2 -0
  170. stage_cli-1.0.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,519 @@
1
+ - name: e-Careers
2
+ platform: workable
3
+ slug: ecareers
4
+ source_of_record: discover
5
+ last_verified: &id003 2026-08-16
6
+ notes: '2026-08-16: adopted from this employer''s own apply URL, then paused to
7
+ match the rest of the workable platform, which is parked until 2026-08-18 after
8
+ two 429s in one day.'
9
+ - name: East Penn Manufacturing Company
10
+ platform: custom_json
11
+ slug: eastpennmanufacturing
12
+ source_of_record: discover
13
+ last_verified: 2026-09-01
14
+ notes: '2026-09-01: iCIMS serves no JSON, so this reads the search page.
15
+ Verified an IT Cybersecurity internship.'
16
+ custom:
17
+ url: https://careers-eastpennmanufacturing.icims.com/jobs/search?ss=1&in_iframe=1
18
+ format: html
19
+ row_selector: div.row:has(a.iCIMS_Anchor)
20
+ fields:
21
+ title: a.iCIMS_Anchor h3
22
+ url: a.iCIMS_Anchor::attr(href)
23
+ location: .header.left span + span
24
+ - name: Eaton
25
+ platform: custom_json
26
+ slug: eaton
27
+ source_of_record: discover
28
+ last_verified: 2026-08-16
29
+ notes: Eightfold tenant honouring filter_career_level; the location filter is stripped
30
+ because it hid the one Canadian posting.
31
+ custom:
32
+ url: https://eaton.eightfold.ai/api/pcsx/search?domain=eaton.com&query=&start=0&sort_by=relevance&filter_career_level=Intern
33
+ jobs_path: data.positions
34
+ fields:
35
+ title: name
36
+ id: id
37
+ location: standardizedLocations
38
+ department: department
39
+ url_template: https://eaton.eightfold.ai/careers/job/{id}
40
+ page_param: start
41
+ page_size: 10
42
+ max_pages: 20
43
+ - name: eBay
44
+ platform: workday
45
+ slug: ebay
46
+ source_of_record: openjobs
47
+ last_verified: 2026-08-14
48
+ recheck_after: &id007 2026-10-01
49
+ workday_tenant: ebay
50
+ workday_site: apply
51
+ workday_dc: wd5
52
+ notes: '2026-08-14: verified by a real sync — this board returned postings'
53
+ - name: Eclipse Automation
54
+ platform: greenhouse
55
+ slug: eclipse
56
+ source_of_record: discover
57
+ last_verified: &id002 2026-08-14
58
+ - name: Egra
59
+ platform: ashby
60
+ slug: egra
61
+ source_of_record: manual
62
+ last_verified: 2026-08-13
63
+ notes: '2026-08-13: official active AI research internship application verifies
64
+ the public Ashby board.'
65
+ - name: Eidos-Montreal
66
+ platform: custom_json
67
+ slug: dayforce-eic
68
+ source_of_record: discover
69
+ last_verified: 2026-08-18
70
+ rate_profile: conservative
71
+ notes: 'Dayforce, reached by sending the /api/auth/csrf token as x-csrf-token. 2026-08-21:
72
+ two boards on this host answered 403 in one run, so the row is pinned conservative.'
73
+ custom:
74
+ url: https://jobs.dayforcehcm.com/api/geo/eic/jobposting/search
75
+ method: POST
76
+ body:
77
+ clientNamespace: eic
78
+ jobBoardCode: CANDIDATEPORTAL
79
+ cultureCode: en-CA
80
+ distanceUnit: 1
81
+ handshake_url: https://jobs.dayforcehcm.com/api/auth/csrf
82
+ token_pattern: '"csrfToken":"([a-f0-9]+)"'
83
+ token_header: x-csrf-token
84
+ jobs_path: jobPostings
85
+ fields:
86
+ title: jobTitle
87
+ id: jobPostingId
88
+ description: jobDescription
89
+ location: postingLocations.0.formattedAddress
90
+ url_template: https://jobs.dayforcehcm.com/en-CA/eic/CANDIDATEPORTAL/jobs/{id}
91
+ page_param: paginationStart
92
+ page_size: 25
93
+ page_step: 25
94
+ max_pages: 20
95
+ - name: Electric Hydrogen
96
+ platform: greenhouse
97
+ slug: eh2internship
98
+ source_of_record: discover
99
+ last_verified: 2026-08-20
100
+ notes: The employer's internships-only greenhouse board; it answered 200 with an
101
+ empty roster on 2026-08-20.
102
+ - name: Electronic Arts
103
+ platform: custom_json
104
+ slug: ea
105
+ source_of_record: discover
106
+ last_verified: 2026-08-20
107
+ notes: '2026-08-20: reopened — the 2026-08-14 note said custom_json was the route
108
+ once a contract existed, and jobs.ea.com is the same Avature listFilterMode markup
109
+ the Two Sigma row pins.'
110
+ custom:
111
+ url: https://jobs.ea.com/en_US/careers/SearchJobs/?listFilterMode=1&jobRecordsPerPage=20
112
+ format: html
113
+ row_selector: article.article--result
114
+ fields:
115
+ title: h3.article__header__text__title a
116
+ id: h3.article__header__text__title a::slugid(href)
117
+ url: h3.article__header__text__title a::attr(href)
118
+ location: span.list-item-location
119
+ department: span.list-item-department
120
+ employment_type: span.list-item-workerType
121
+ page_param: jobOffset
122
+ page_size: 20
123
+ max_pages: 20
124
+ - name: ElevenLabs
125
+ platform: ashby
126
+ slug: elevenlabs
127
+ source_of_record: openjobs
128
+ last_verified: 2026-08-11
129
+ notes: '2026-08-11: enabled on slug evidence - ashby publishes no board name, but
130
+ the slug folds to the caption and the board returned 238 job(s)'
131
+ - name: Ellipsis Labs
132
+ platform: ashby
133
+ slug: ellipsislabs
134
+ source_of_record: discover
135
+ last_verified: &id004 2026-08-14
136
+ name_gate_exempt: true
137
+ notes: '2026-08-14: board token taken from this employer''s own application URL
138
+ in a feed posting, not from slug guessing; ashby publishes no board name, so the
139
+ name gate cannot confirm it and provenance is the evidence (11 job(s))'
140
+ - name: EllisDon
141
+ platform: workday
142
+ slug: ellisdon
143
+ source_of_record: discover
144
+ last_verified: 2026-08-17
145
+ workday_tenant: ellisdon
146
+ workday_site: Ellis-Don
147
+ workday_dc: wd3
148
+ notes: '2026-08-17: verified by scratch sync, 120 postings returned. Canadian construction;
149
+ 0 internships on the day of adoption, kept for its seasonal IT and co-op intake'
150
+ - name: Eluvio
151
+ platform: workable
152
+ slug: eluvio
153
+ source_of_record: discover
154
+ last_verified: 2026-08-17
155
+ notes: '2026-08-14: paused after two 429s in one day, the second after 7 requests;
156
+ paused_until resumed it.'
157
+ - name: Enbridge
158
+ platform: workday
159
+ slug: enbridge
160
+ source_of_record: discover
161
+ last_verified: &id001 2026-08-17
162
+ workday_tenant: enbridge
163
+ workday_site: enbridge_careers
164
+ workday_dc: wd3
165
+ notes: '2026-08-17: found by a plain-HTTP scan of the employer''s own careers page
166
+ for a known ATS hostname, no browser and one request per host.'
167
+ - name: Encephalo Investments
168
+ platform: smartrecruiters
169
+ slug: encephaloinvestments
170
+ source_of_record: discover
171
+ last_verified: 2026-08-18
172
+ notes: '2026-08-18: seen in feed postings but absent from the registry; discover
173
+ matched smartrecruiters/encephaloinvestments with 3 job(s) and the board named
174
+ itself, so it is polled directly instead of secondhand'
175
+ - name: Endava
176
+ platform: smartrecruiters
177
+ slug: endava
178
+ source_of_record: openjobs
179
+ last_verified: &id005 2026-08-14
180
+ - name: Enghouse Systems
181
+ platform: bamboohr
182
+ slug: enghouse
183
+ source_of_record: discover
184
+ last_verified: *id001
185
+ notes: '2026-08-17: found by careers-page ATS scan, one plain GET. verify returned
186
+ 17 jobs and needs-a-manual-check, the expected verdict where the platform publishes
187
+ no board name; token equals the company name'
188
+ - name: Engineers Gate
189
+ platform: greenhouse
190
+ slug: engineersgate
191
+ source_of_record: discover
192
+ last_verified: *id002
193
+ - name: Enova International
194
+ platform: greenhouse
195
+ slug: enova
196
+ source_of_record: discover
197
+ last_verified: *id002
198
+ - name: Enpal
199
+ platform: ashby
200
+ slug: enpal
201
+ source_of_record: manual
202
+ last_verified: 2026-08-13
203
+ notes: '2026-08-13: official active automation and software-development internship
204
+ application verifies the public Ashby board.'
205
+ - name: Ensemble Health Partners
206
+ platform: greenhouse
207
+ slug: ensemble
208
+ source_of_record: discover
209
+ last_verified: *id002
210
+ - name: Enverus
211
+ platform: jobvite
212
+ slug: drillinginfo
213
+ source_of_record: openjobs
214
+ enabled: false
215
+ notes: '2026-08-21: re-checked on the server-rendered board as well; the tenant
216
+ answers but renders no jv-job-list table, so it is an empty or retired board'
217
+ - name: Epia Neuro
218
+ platform: ashby
219
+ slug: epianeuro
220
+ source_of_record: discover
221
+ last_verified: *id003
222
+ name_gate_exempt: true
223
+ notes: '2026-08-16: token from this employer''s own apply URL, not slug guessing;
224
+ ashby publishes no board name, so provenance is the evidence (16 job(s))'
225
+ - name: Epic Games
226
+ platform: greenhouse
227
+ slug: epicgames
228
+ source_of_record: openjobs
229
+ last_verified: *id002
230
+ - name: Epic Systems
231
+ platform: custom_json
232
+ slug: epic-systems
233
+ source_of_record: discover
234
+ last_verified: 2026-08-20
235
+ enabled: false
236
+ notes: '2026-08-20: closed for good — an Avature tenant that does not serve the
237
+ listFilterMode markup, and the owner confirmed a DevTools capture finds no reusable
238
+ listing request.'
239
+ custom:
240
+ url: https://careers.epic.com/jobs/
241
+ fields:
242
+ title: title
243
+ id: id
244
+ - name: Epicor
245
+ platform: workday
246
+ slug: epicorsoftware
247
+ source_of_record: discover
248
+ last_verified: &id006 2026-08-14
249
+ workday_tenant: epicorsoftware
250
+ workday_site: epicorjobs
251
+ workday_dc: wd5
252
+ notes: '2026-08-14: verified by a real sync — this board returned postings, which
253
+ is the only verification a Workday tenant can have without an offline probe'
254
+ - name: EPRI
255
+ platform: workday
256
+ slug: vhr-epri
257
+ source_of_record: discover
258
+ workday_tenant: vhr-epri
259
+ workday_site: epricareers
260
+ workday_dc: wd1
261
+ enabled: false
262
+ notes: '2026-08-20: re-checked tenant-wide; the CXS jobs endpoint still answers
263
+ 422 for this site, so the closed-contract verdict stands on a fresh measurement.'
264
+ - name: Equativ
265
+ platform: lever
266
+ slug: equativ
267
+ source_of_record: discover
268
+ last_verified: *id004
269
+ name_gate_exempt: true
270
+ notes: '2026-08-14: board token taken from this employer''s own application URL
271
+ in a feed posting, not from slug guessing; lever publishes no board name, so the
272
+ name gate cannot confirm it and provenance is the evidence (22 job(s))'
273
+ - name: Equifax
274
+ platform: workday
275
+ slug: equifax
276
+ source_of_record: manual
277
+ last_verified: 2026-08-13
278
+ workday_tenant: equifax
279
+ workday_site: UR_External
280
+ workday_dc: wd5
281
+ workday_facet: jobFamilyGroup:ef45ca2670b010249197ce07f79d9cf0
282
+ notes: '2026-08-13: official Workday endpoint verified; its Internships job-family
283
+ group has two listings.'
284
+ - name: Eragon
285
+ platform: ashby
286
+ slug: eragon
287
+ source_of_record: discover
288
+ last_verified: *id004
289
+ name_gate_exempt: true
290
+ notes: '2026-08-14: board token taken from this employer''s own application URL
291
+ in a feed posting, not from slug guessing; ashby publishes no board name, so the
292
+ name gate cannot confirm it and provenance is the evidence (4 job(s))'
293
+ - name: Ericsson
294
+ platform: custom_json
295
+ slug: ericsson
296
+ source_of_record: discover
297
+ last_verified: 2026-08-20
298
+ notes: Its Phenom-shaped widgets answer 401, but the site is Eightfold; /api/pcsx/search
299
+ returns all 491 positions.
300
+ custom:
301
+ url: https://jobs.ericsson.com/api/pcsx/search?domain=ericsson.com&query=&start=0&sort_by=relevance
302
+ jobs_path: data.positions
303
+ fields:
304
+ title: name
305
+ id: id
306
+ location: standardizedLocations
307
+ department: department
308
+ url_template: https://jobs.ericsson.com/careers/job/{id}
309
+ page_param: start
310
+ page_size: 10
311
+ max_pages: 20
312
+ - name: Escape Velocity Entertainment
313
+ platform: workable
314
+ slug: escape-velocity-entertainment-inc
315
+ source_of_record: openjobs
316
+ last_verified: 2026-08-17
317
+ notes: '2026-08-14: paused after two 429s in one day, the second after 7 requests;
318
+ paused_until resumed it.'
319
+ - name: eSentire
320
+ platform: custom_json
321
+ slug: esentire
322
+ source_of_record: discover
323
+ last_verified: 2026-08-21
324
+ rate_profile: conservative
325
+ notes: 'Dayforce, reached by sending the /api/auth/csrf token as x-csrf-token. 2026-08-21:
326
+ two boards on this host answered 403 in one run, so the row is pinned conservative.'
327
+ custom:
328
+ url: https://jobs.dayforcehcm.com/api/geo/esentire/jobposting/search
329
+ method: POST
330
+ body:
331
+ clientNamespace: esentire
332
+ jobBoardCode: CANDIDATEPORTAL
333
+ cultureCode: en-CA
334
+ distanceUnit: 1
335
+ handshake_url: https://jobs.dayforcehcm.com/api/auth/csrf
336
+ token_pattern: '"csrfToken":"([a-f0-9]+)"'
337
+ token_header: x-csrf-token
338
+ jobs_path: jobPostings
339
+ fields:
340
+ title: jobTitle
341
+ id: jobPostingId
342
+ description: jobDescription
343
+ location: postingLocations.0.formattedAddress
344
+ url_template: https://jobs.dayforcehcm.com/en-CA/esentire/CANDIDATEPORTAL/jobs/{id}
345
+ page_param: paginationStart
346
+ page_size: 25
347
+ page_step: 25
348
+ - name: Espa AI
349
+ platform: ashby
350
+ slug: espa
351
+ source_of_record: discover
352
+ last_verified: *id004
353
+ name_gate_exempt: true
354
+ notes: '2026-08-14: board token taken from this employer''s own application URL
355
+ in a feed posting, not from slug guessing; ashby publishes no board name, so the
356
+ name gate cannot confirm it and provenance is the evidence (2 job(s))'
357
+ - name: Esri
358
+ platform: greenhouse
359
+ slug: esri
360
+ source_of_record: discover
361
+ last_verified: *id002
362
+ - name: Etched.ai
363
+ platform: greenhouse
364
+ slug: etchedai
365
+ source_of_record: discover
366
+ last_verified: *id002
367
+ - name: Ether.fi
368
+ platform: ashby
369
+ slug: ether.fi
370
+ source_of_record: discover
371
+ last_verified: *id003
372
+ name_gate_exempt: true
373
+ notes: '2026-08-16: token from this employer''s own apply URL, not slug guessing;
374
+ ashby publishes no board name, so provenance is the evidence (10 job(s))'
375
+ - name: Ethernovia
376
+ platform: greenhouse
377
+ slug: ethernovia
378
+ source_of_record: openjobs
379
+ last_verified: 2026-08-14
380
+ - name: ETHGlobal
381
+ platform: ashby
382
+ slug: ethglobal
383
+ source_of_record: discover
384
+ last_verified: 2026-08-16
385
+ name_gate_exempt: true
386
+ notes: '2026-08-16: token from this employer''s own apply URL, not slug guessing;
387
+ ashby publishes no board name, so provenance is the evidence (1 job(s))'
388
+ - name: Etsy
389
+ platform: custom_json
390
+ slug: etsy
391
+ source_of_record: discover
392
+ last_verified: 2026-08-21
393
+ notes: '2026-08-21: the official Etsy careers search server-renders 30 job cards
394
+ per page; the existing HTML adapter returned 30 authoritative postings with stable
395
+ detail URLs.'
396
+ custom:
397
+ url: https://careers.etsy.com/jobs/search?page=1&query=
398
+ format: html
399
+ row_selector: article.job-search-results-card-col
400
+ fields:
401
+ title: h3.job-search-results-card-title a
402
+ id: h3.job-search-results-card-title a::attr(href)
403
+ url: h3.job-search-results-card-title a::attr(href)
404
+ location: .job-component-location span
405
+ department: .job-component-department span
406
+ page_param: page
407
+ page_size: 30
408
+ page_start: 1
409
+ page_step: 1
410
+ max_pages: 5
411
+ - name: Eulerity
412
+ platform: greenhouse
413
+ slug: eulerity
414
+ source_of_record: discover
415
+ last_verified: *id002
416
+ - name: Eurofins
417
+ platform: smartrecruiters
418
+ slug: eurofins
419
+ source_of_record: discover
420
+ last_verified: *id005
421
+ - name: Euronext
422
+ platform: workday
423
+ slug: hrhub
424
+ source_of_record: discover
425
+ last_verified: *id006
426
+ workday_tenant: hrhub
427
+ workday_site: euronext_career_page
428
+ workday_dc: wd3
429
+ notes: '2026-08-14: verified by a real sync — this board returned postings, which
430
+ is the only verification a Workday tenant can have without an offline probe'
431
+ - name: EV Realty
432
+ platform: lever
433
+ slug: evrealty-us
434
+ source_of_record: discover
435
+ last_verified: *id004
436
+ name_gate_exempt: true
437
+ notes: '2026-08-14: board token taken from this employer''s own application URL
438
+ in a feed posting, not from slug guessing; lever publishes no board name, so the
439
+ name gate cannot confirm it and provenance is the evidence (1 job(s))'
440
+ - name: Evercore
441
+ platform: custom_json
442
+ slug: evercore
443
+ source_of_record: discover
444
+ last_verified: 2026-08-20
445
+ enabled: false
446
+ notes: '2026-08-20: its tal.net tenant answers every board url with an oleeoProtect
447
+ altcha challenge titled Quick Check Needed. That is a CAPTCHA, so it is a policy
448
+ boundary, not a gap.'
449
+ custom:
450
+ url: https://evercore.tal.net/vx/lang-en-GB/mobile-0/appcentre-ext/brand-6/candidate/jobboard/vacancy/2/adv/
451
+ fields:
452
+ title: title
453
+ id: id
454
+ - name: Everpure
455
+ platform: greenhouse
456
+ slug: purestorage
457
+ source_of_record: discover
458
+ last_verified: 2026-08-20
459
+ notes: '2026-08-20: everpuredata.com embeds this board and greenhouse names it Everpure;
460
+ the purestorage token is the pre-rename one, so name and token differ legitimately.'
461
+ - name: Evolution
462
+ platform: smartrecruiters
463
+ slug: evolution
464
+ source_of_record: openjobs
465
+ last_verified: *id005
466
+ - name: Evolver
467
+ platform: greenhouse
468
+ slug: evolver
469
+ source_of_record: discover
470
+ last_verified: *id002
471
+ - name: Excel Sports Management
472
+ platform: greenhouse
473
+ slug: excelsportsmanagement
474
+ source_of_record: discover
475
+ last_verified: *id002
476
+ - name: Expedia
477
+ platform: workday
478
+ slug: expedia
479
+ source_of_record: openjobs
480
+ last_verified: 2026-08-18
481
+ recheck_after: *id007
482
+ workday_tenant: expedia
483
+ workday_site: search
484
+ workday_dc: wd108
485
+ notes: Parked as never answering on wd5/private; it is live on wd108/search with
486
+ 141 postings.
487
+ - name: extreme network
488
+ platform: lever
489
+ slug: extremenetworks
490
+ source_of_record: openjobs
491
+ last_verified: 2026-08-04
492
+ - name: EY
493
+ platform: custom_json
494
+ slug: ey
495
+ source_of_record: discover
496
+ last_verified: 2026-08-20
497
+ notes: SuccessFactors RMK; its /rss.xml is 106MB and ignores q, but the search page
498
+ honours q=internship and pages on startrow.
499
+ custom:
500
+ url: https://careers.ey.com/search/?q=internship&sortColumn=referencedate&sortDirection=desc
501
+ format: html
502
+ authoritative: false
503
+ row_selector: tr.data-row
504
+ fields:
505
+ title: a.jobTitle-link
506
+ id: a.jobTitle-link::slugid(href)
507
+ url: a.jobTitle-link::attr(href)
508
+ location: .jobLocation
509
+ page_param: startrow
510
+ page_size: 25
511
+ page_step: 25
512
+ max_pages: 8
513
+ - name: Eyeline
514
+ platform: lever
515
+ slug: scanlinevfx
516
+ source_of_record: openjobs
517
+ enabled: false
518
+ notes: '2026-08-08: lever publishes no board name, so a 200 with jobs is not evidence
519
+ of the right company; needs a human to open the board once'