news 2026/9/9 18:55:04

如何用 scan-ats-full --seeds 把 YC 与 a16z 投资组合公司作为种子做 ATS 扫描

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 scan-ats-full --seeds 把 YC 与 a16z 投资组合公司作为种子做 ATS 扫描

如何用 scan-ats-full --seeds 把 YC 与 a16z 投资组合公司作为种子做 ATS 扫描

【免费下载链接】career-opsOpen-source AI job search: scan job portals, evaluate listings into a structured A-H report with a global 1-5 score, tailor your CV, track applications — runs locally in your AI coding CLI (Claude Code, Codex, OpenCode, Antigravity…)项目地址: https://gitcode.com/GitHub_Trending/ca/career-ops

career-ops 里的scan-ats-full.mjs默认是"反向 ATS 扫描":它遍历 Greenhouse、Lever、Ashby、Workday、iCIMS 的公开公司目录,找出符合你portals.yml过滤条件的新职位。但目录遍历慢、且只覆盖"已经在这些目录里"的公司。--seeds参数提供了另一条发现路径:直接从 Y Combinator 和 Andreessen Horowitz (a16z) 的公开投资组合拉出公司清单,逐家探测它们的 ATS 招聘页,把命中的新职位写入data/pipeline.md。这条路径由 seeds/vc-portfolios.mjs 实现,全程不需要登录、API key 或 LLM token,只依赖两个公开数据源。

读完本文,你能完成一次"以 VC 投资组合为种子的 ATS 扫描",知道结果写到哪里、如何验证,以及哪些公司会被静默跳过。

扫描链路:从投资组合到 pipeline

整条链路在 seeds/README.md 中描述如下:

VC portfolio API/page ↓ seeds/vc-portfolios.mjs SeedCompany[] ↓ toPortalEntry() PortalEntry (careers_url set to best-guess ATS URL) ↓ provider.detect() (same as portals.yml companies) ATS provider fetches jobs ↓ title_filter / location_filter / dedup data/pipeline.md

几个关键环节的实际行为(来自 scan-ats-full.mjs 源码):

  • 两个数据源,均无鉴权:YC 走公开 JSON APIhttps://api.ycombinator.com/v0.1/companies;a16z 解析公开页面https://a16z.com/portfolio/的 HTML,页面结构变化时会优雅降级而不是报错。
  • ATS 探测顺序固定:每个种子公司经toPortalEntry()转成PortalEntry后,按 greenhouse → lever → ashby 的顺序调用各 provider 的detect(),第一个命中者胜出。没有命中任何 provider 的公司被静默跳过。Workday 不在探测列表里,因为它需要tenant|instance|site三元组,无法从投资组合 slug 推导。
  • 过滤与去重和常规扫描一致portals.yml里的title_filter(本扫描器可用title_filter_full覆盖)、location_filtercontent_filter同样生效;职位 URL 先在本轮内去重,再与data/scan-history.tsv的历史记录去重,所以重复运行不会灌入重复条目。

前提条件:portals.yml 必须已存在

scan-ats-full.mjs启动时会检查portals.yml,找不到则直接退出:

Error: portals.yml not found. Run onboarding first — the reverse scan reuses its title_filter/location_filter.

也就是说,种子扫描并不独立于 onboarding——它复用 onboarding 生成的过滤条件。如果你的portals.yml还没有title_filter(或title_filter_full)的positive关键词,脚本会打印警告"every fresh posting on every board will match",扫描本身会继续,但你大概率会被无关职位淹没。建议先按 templates/portals.example.yml 的样子补齐关键词再跑。

另外注意日期门控:反向扫描只针对职位,默认窗口是--since 3(最近 3 天)。带日期但早于窗口的职位直接丢弃;没有发布日期的职位默认丢弃(计入Undated dropped),加--include-undated才会保留。

执行种子扫描

在仓库根目录执行。最短主路径是先 dry-run 预览,确认命中符合预期后再正式写入:

# 预览:只打印匹配,不写任何文件 node scan-ats-full.mjs --seeds yc,a16z --dry-run # 正式运行:YC + a16z 两个种子源 node scan-ats-full.mjs --seeds yc,a16z

--seeds的值是逗号分隔的小写源 id,目前SEED_SOURCES注册表只登记了yca16z两个;传入其他值会报错退出:

Error: unknown seed source(s): xxx. Valid: yc, a16z

package.json 提供了两个 npm 快捷方式,等价于上面两条命令:

npm run scan:seeds # 即 node scan-ats-full.mjs --seeds yc,a16z npm run scan:yc # 即 node scan-ats-full.mjs --seeds yc

一个值得注意的行为:当--seeds是唯一的发现参数(没有--ats)时,--ats默认为空,即不会顺带遍历完整的 ATS 目录——这是源码中显式避免的"意外全量扫描"。所以--seeds yc,a16z只探测投资组合公司,扫描范围就是这两份组合。

控制扫描范围

常用参数及在种子扫描中的实际作用:

# 扩大时间窗口到最近 7 天(--seeds yc 单源示例) node scan-ats-full.mjs --seeds yc --since 7 # 限制每个种子源探测的公司数上限 node scan-ats-full.mjs --seeds yc,a16z --limit 200 # 组合种子源与常规 ATS 目录 node scan-ats-full.mjs --seeds yc --ats greenhouse,lever --since 5
  • --since <天数>:职位新鲜度窗口,缺省 3 天。
  • --limit <N>:对种子源同样生效,按 slug 顺序截取前 N 家;配--shuffle则随机抽样 N 家。适合先用小样本试跑。
  • --ats <list>:想同时走常规目录扫描时才加;种子源与目录源的结果汇到同一次运行的同一份输出去重。
  • --verbose:打印每个公司的抓取失败原因(默认静默跳过);--liveness:写入前用 Playwright 逐一验证职位 URL 存活;--md-out <dir>:额外写一份按日期命名的 Markdown 摘要;--json:stdout 只输出机器可读 JSON(进度信息走 stderr)。

结果验证:看哪里、看什么

正式运行(非 dry-run)结束时,stdout 会给出汇总段:

Companies scanned: <总数> Unreachable boards: <失败数> Undated dropped: <无日期丢弃数> (若有) New matches: <命中数> New offers: + [yc-seed] 2026-09-05 | Stripe | Senior Backend Engineer | Remote https://...

有命中时的落盘行为:

  • 职位追加到data/pipeline.md## Pendientes段,同时记录到data/scan-history.tsv;日志会打印Results saved to data/pipeline.md and data/scan-history.tsv
  • 最后提示下一步:→ Run /career-ops pipeline to evaluate new offers.(进入 career-ops 的评估流程,为这些新职位生成 A-H 报告)。

没有新命中时输出Nothing new.,这是正常结果——窗口内确实没有新职位,或全部被过滤/去重挡掉,而不是故障。dry-run 结尾则是(dry run — run without --dry-run to save results),确认预览无误后去掉--dry-run重跑即可。

排查"为什么命中很少"时,先区分两种情况:某家公司没被探测到(ATS 探测未命中或拉取失败,后者计入Unreachable boards,加--verbose才能看到逐家原因),与探测到了但职位被title_filter/location_filter/日期窗口过滤掉(后者不会逐条打印)。--json输出里的postingsDroppedNoDateunreachableBoards等字段可以把这两类分开。

边界与限制

  • 只覆盖 Greenhouse / Lever / Ashby:种子探测的 provider 列表就是这三个(SEED_PROVIDERS)。用 Workday、iCIMS 或其他 ATS 的组合公司会被跳过。
  • YC 抓取规模:代码按 API 返回的totalPages/nextPage逐页翻页,YC_MAX_PAGES = 500只作为防失控的硬上限(见 seeds/vc-portfolios.mjs)。seeds/README.md 中"最多 3 页 × 1000 家公司"的描述与这段实现不完全一致,实际抓取量以 API 分页信号和日志里的Companies scanned计数为准。
  • 安全设计:所有 slug 在拼 URL 前都过SLUG_RE = /^[A-Za-z0-9._-]+$/校验,构造出的 ATS URL 还要过entryOnHost()的 SSRF 防护;全程无 auth token、无 headless 浏览器、无 LLM API 调用。
  • 并发:探测以并发 20(CONCURRENCY)跑,单家公司整段抓取有 5 分钟超时,一家卡死不会拖住整个 worker。

下一步

扫描成功后按提示运行/career-ops pipeline,让 career-ops 对data/pipeline.md里的新职位做 A-H 评估与 1-5 分打分。如果你的过滤结果长期偏噪,回到portals.yml调整title_filter_full(该字段只影响本扫描器,不干扰scan.mjs的既有过滤)再跑一轮--dry-run验证。

程序化复用的话,seeds/README.md 给出了直接 import 的写法(文档示例):

import { fetchYCCompanies, toPortalEntry } from './seeds/vc-portfolios.mjs'; const companies = await fetchYCCompanies(); const entry = toPortalEntry(companies[0]); // → { name: 'Stripe', careers_url: 'https://job-boards.greenhouse.io/stripe', source: 'yc' }

新增其他 VC 组合时,按 seeds/README.md 的"Adding more VC portfolios"一节:写纯函数解析器 +fetchXyzCompanies(),注册进SEED_SOURCES--seeds即自动支持新 id。

【免费下载链接】career-opsOpen-source AI job search: scan job portals, evaluate listings into a structured A-H report with a global 1-5 score, tailor your CV, track applications — runs locally in your AI coding CLI (Claude Code, Codex, OpenCode, Antigravity…)项目地址: https://gitcode.com/GitHub_Trending/ca/career-ops

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 18:54:54

Marlin 3D 打印机固件完整指南:5 步烧录并调好你的机器

Marlin 3D 打印机固件完整指南&#xff1a;5 步烧录并调好你的机器 【免费下载链接】Marlin Marlin is a firmware for RepRap 3D printers optimized for both 8 and 32 bit microcontrollers. Marlin supports all common platforms. Many commercial 3D printers come with …

作者头像 李华
网站建设 2026/9/9 18:54:47

MySQL 8.0.27保姆级安装教程:从下载到排错,Windows环境全流程详解

很多同学在群里问我&#xff0c;MySQL到底怎么装才能不翻车。说实话&#xff0c;MySQL 8.0.27这个版本在安装上已经比早期版本人性化不少&#xff0c;但网上教程经常只讲到“下一步下一步”&#xff0c;版本还停留在5.7的老流程&#xff0c;照着做很容易踩坑。我最近正好在一台…

作者头像 李华
网站建设 2026/9/9 18:53:52

TVBoxOSC 电视盒子播放器完整指南:3 步搞定全格式播放与直播源

TVBoxOSC 电视盒子播放器完整指南&#xff1a;3 步搞定全格式播放与直播源 【免费下载链接】TVBoxOSC TVBoxOSC - 一个基于第三方项目的代码库&#xff0c;用于电视盒子的控制和管理。 项目地址: https://gitcode.com/GitHub_Trending/tv/TVBoxOSC TVBoxOSC 是一个开源的…

作者头像 李华
网站建设 2026/9/9 18:53:36

2026美赛冲刺:六类题型代码模板与备赛全攻略

2026年美赛已经进了最后的冲刺窗口&#xff0c;每年到这个时候&#xff0c;后台都会涌进一堆“求思路”“求代码”的消息。我这两年带队伍最大的感受是&#xff1a;美赛根本不比谁代码写得花哨&#xff0c;比的是谁能在有限时间内把题目转化成可计算的模型&#xff0c;再稳定地…

作者头像 李华
网站建设 2026/9/9 18:52:41

Seelen-UI 媒体模块:把 Windows 上 5 个声音问题一次管住的开关

Seelen-UI 媒体模块&#xff1a;把 Windows 上 5 个声音问题一次管住的开关 【免费下载链接】Seelen-UI The Fully Customizable Desktop Environment for Windows 10/11. 项目地址: https://gitcode.com/GitHub_Trending/se/Seelen-UI 音乐放到一半&#xff0c;微信语音…

作者头像 李华
网站建设 2026/9/9 18:51:36

工业物联网选型避坑指南:90%工厂都踩过的5个坑

上个月中旬&#xff0c;我在苏州一家精密机加工厂陪客户做工业物联网服务商选型。三家候选人讲完方案之后&#xff0c;设备科长把我拉到走廊&#xff0c;问了一个特别诚恳的问题&#xff1a;"这三家的网关报价一个比一个低&#xff0c;中间差价三百多&#xff0c;你觉得哪…

作者头像 李华