career-ops 波兰求职 aplikuj 模式解析:在浏览器里实时填报申请表单的 AI 助理工作流
modes/pl/aplikuj.md 是 career-ops 项目波兰语模式集(modes/pl/)中的核心成员之一。它描述的是一个交互式"表单填报助理"模式:当候选人在 Chrome 中打开一份求职申请表时,AI Agent 读取当前页面内容,自动匹配此前评估该公司的报告(report),复用既有评分与答题草稿,并为表单中的每个问题现场生成可直接复制粘贴的个性化回答。本文以此文档为骨架,结合仓库内对应实现与波兰市场本地化资料,完整还原该模式的 8 步工作流、波兰表单的特殊处理规则与落地命令,供开发者理解如何把"评估报告"变成"可提交的申请答案"。
一、aplikuj 模式在模式体系中的位置
career-ops 将整套求职工作流拆成多种可组合的"模式(mode)",存放在 modes/ 目录下。面向波兰市场的候选者使用 modes/pl/ 波兰语模式集,其中 README.md 明确列出首批翻译的四个最高影响模式:
| 文件 | 翻译自 | 角色 |
|---|---|---|
_shared.md |
modes/_shared.md (EN) |
共享上下文、目标角色原型、全局规则、波兰市场专有术语 |
oferta.md |
modes/oferta.md (ES) |
完整岗位评估(A–F 区块,modes/pl/oferta.md) |
aplikuj.md |
modes/apply.md (EN) |
本文主题:实时申请表单填报助理 |
pipeline.md |
modes/pipeline.md (ES) |
URL 收件箱 / "第二大脑"批量处理(modes/pl/pipeline.md) |
aplikuj.md 的英文原型是 modes/apply.md。需要注意:波兰语版是一份聚焦核心流程的精简翻译,而英文版额外包含更厚的"提交前门禁"(liveness 存活校验、blacklist 黑名单、knock-out 资格问题预扫描、移民身份与司法辖区禁用内容警告等,见 modes/apply.md 的 Step 5/5b/5c/5d)。波兰语版把叙述重心放在"读屏 → 匹配报告 → 生成答案"这一主线,因此本文按 aplikuj.md 自身的结构讲解,并在相应小节标注英文原版中可选的扩展门禁作为进阶参考。
何时激活这套波兰模式
按 modes/pl/README.md,当满足以下任一条件时应使用 modes/pl/:
- 主要申请波兰语招聘启事(Pracuj.pl、No Fluff Jobs、Just Join IT、LinkedIn PL、Bulldogjob、公司招聘页);
- 你的 CV 是波兰语,或按岗位在 PL 与 EN 之间切换;
- 需要自然、技术性的波兰语回答与动机信,而非机器翻译腔;
- 需要正确应对波兰市场的合同特殊性:UoP、B2B、umowa zlecenie、试用期、notice period、ZUS、PPK 等。
激活有两种方式:会话开始时告诉 Agent "使用 modes/pl/ 中的波兰模式"(会话级);或在 config/profile.yml 中永久配置:
language:
primary: pl
modes_dir: modes/pl
(对照 config/profile.example.yml 中的 language 结构。英文原版默认模式仍可用于波兰语岗位,只是不掌握波兰市场细节。)
二、前置条件:Playwright 可见模式与无浏览器兜底
aplikuj.md 将运行环境分成两档:
- 理想情况 —— Playwright 可见模式:候选人在浏览器中能亲眼看到 Agent 操作页面,Agent 可以真正与表单交互(读快照、定位字段、填写)。可见模式也避免"盲填"带来的提交错误。
- 无 Playwright 的情况:候选人改为分享屏幕截图(Read 工具可读图)、手动粘贴表单问题文本,或只提供公司 + 岗位名让 Agent 先检索上下文。
仓库在工具使用上有明确的纪律约束。modes/pl/_shared.md 的"工具"表中强调一条关键限制:禁止 2 个及以上 Agent 并行使用 Playwright——它们共享同一个浏览器实例;而 WebSearch 用于薪资、公司文化与 LinkedIn 联系人检索,WebFetch 作为静态页面回退。
三、8 步工作流总览
aplikuj.md 用一段简洁的伪代码定义了模式的整体闭环:
1. WYKRYJ -> 读取活动中的 Chrome 标签页(截图 / URL / 标题)
2. ZIDENTYFIKUJ -> 从页面中抽取公司 + 岗位
3. WYSZUKAJ -> 与 reports/ 下已有报告匹配
4. ZAŁADUJ -> 读取完整报告 + Blok G(若存在)
5. PORÓWNAJ -> 屏幕上的岗位与已评估岗位是否一致?有变化则告警
6. PRZEANALIZUJ -> 识别表单中所有可见问题
7. WYGENERUJ -> 为每个问题生成个性化回答
8. ZAPREZENTUJ -> 展示格式化输出,便于直接复制
下文按文档中编号的"步骤"逐条展开,并给出命令与实现依据。
四、分步拆解:从检测页面到复制粘贴
步骤 1 —— 检测当前岗位(Wykryj ofertę)
有 Playwright 时,对活动页面做快照(snapshot),读取标题、URL 与可见内容。无 Playwright 时,依次向候选人索要:① 表单截图;② 表单问题文本;③ 或公司 + 岗位名以便检索既有上下文。这一步决定了后续所有素材的来源,是"读屏"的起点。
步骤 2 —— 识别公司与岗位并加载上下文(Zidentyfikuj i załaduj kontekst)
文档规定严格的处理次序:
- 从页面抽取公司名与岗位名;
- 在
reports/中按公司名做大小写不敏感 grep; - 命中 → 加载完整报告;
- 若报告中含 Blok G(答题草稿),将其作为本次答题的基底;
- 未命中 → 提醒候选人,并建议先跑一次快速 auto-pipeline 完成评估。
这里有两个仓库层面的细节值得展开:
报告的命名与定位。 评估产物遵循 modes/pl/oferta.md 约定的文件命名:
reports/{###}-{company-slug}-{YYYY-MM-DD}.md
{###}:下一个顺序号(三位、零填充)。为避免并发竞态,需先运行node reserve-report-num.mjs原子预留(stdout 返回{###}),写盘后再运行node reserve-report-num.mjs --release {###}释放哨兵;{company-slug}:公司名小写、空格改连字符;{YYYY-MM-DD}:当日日期。
Blok G 到底是什么。 在波兰语模式家族中,oferta.md 的报告模板把答题草稿放在:
## G) Szkice odpowiedzi do aplikacji
(仅当 score >= 4.5 时生成——表单问题的答题草稿)
也就是说,aplikuj 模式所谓的 "Blok G" 就是评估阶段为高分区(≥4.5/5)岗位预写的申请回答草稿。这与英文生态中报告模板 modes/oferta.md 的区块略有差异——英文模板中 ## G) Posting Legitimacy 是岗位可信度评估、答题草稿在 ## H) Draft Application Answers;波兰语版将"答题草稿"合并为 G。阅读报告时应按语言模式家族的约定识别草稿区块,避免跨体系混读。
(英文原版 modes/apply.md 还提供脚本化读取方式:node application-answers.mjs --report <report路径> --read --strict,返回 JSON 形式的既往回答快照,或 --read-draft 读取草稿版区块;波兰语文档未展开这一步,可按需参考英文版调用。)
步骤 3 —— 检测岗位是否变化(Wykryj zmiany roli)
当屏幕上的岗位与已评估报告不一致时,文档要求先告警再决策:
- 提示候选人:"岗位已从 [X] 变为 [Y]。你是想让我重新评估,还是把回答适配到新标题?"
- 选择适配:基于现有材料按新岗位改写回答,不重新评估;
- 选择重估:跑完整 A–F 评估,更新报告并重新生成 Blok G;
- 同步 tracker:必要时在
data/applications.md中更新岗位标题。
这与英文版 Step 3 的语义一致——绝不在岗位漂移时"静默作答"。英文版还要求在起草前核对表单指向的岗位仍然存活、公司与报告匹配,若岗位已关闭则拒绝生成正式文案(除非候选人明确覆盖),这是更严格的前置门禁(对应 modes/apply.md Step 5 Preflight);波兰语版将此收敛为岗位差异告警。
步骤 4 —— 分析表单问题(Przeanalizuj pytania formularza)
需要穷尽识别页面上所有可见问题,文档按控件类型给出清单:
- 开放式文本域:动机信、 "为什么选择这个岗位"、求职动机等;
- 下拉列表:来源渠道("如何得知本公司")、工作许可等;
- 是 / 否:可迁移性(mobility)、签证、到岗可用性等;
- 薪资字段:区间、期望薪资——务必先确认是 netto(净)还是 brutto(毛);
- 上传字段:CV、动机信 PDF、推荐信等。
随后对每个问题分类:Blok G 已回答过的 → 直接复用既有答案;全新问题 → 依据报告 + cv.md 现场生成。英文版在此还有一条值得知道的纪律:为法律、人口统计、工作授权、签证、薪资、残疾、退伍军人、背景调查、搬迁等字段提供回答前,必须确认 config/profile.yml 中确有对应事实,否则标记 needs_candidate_confirmation 并回问候选人,绝不虚构(modes/apply.md Step 6)。
步骤 5 —— 生成个性化回答(Wygeneruj odpowiedzi)
每个问题的回答按如下 5 点素材逻辑构建:
- 报告上下文:优先使用区块 B 的 proof points 与区块 F 的 STAR 故事;
- 既有 Blok G:有草稿就以草稿为基底精修;
- 语气"To ja wybieram Was"(是我在选你们):与 auto-pipeline 同一框架——自信、主动,不卑不亢、不乞求;
- 具体性:引用屏幕上可见岗位中具体的一句话或一个点;
- career-ops proof point:若表单有"补充信息 / 附加说明"字段,把候选人的职业亮点作为佐证放入。
语气框架对应英文 auto-pipeline 中的 "I'm choosing you" 原则:不写 "I'm passionate about…",不写空话,把 "我擅长 X" 换成 "我做了 X,它达成了 Y"。真正打动人的是证据本身,而非形容词。
波兰表单专属字段规则是本节最有市场价值的部分,文档逐条给出策略:
| 字段 | 生成策略 |
|---|---|
| 期望薪资(Oczekiwania płacowe) | 取 profile.yml 中的薪资区间,以 PLN 计,明确标注 netto / brutto 以及 UoP 还是 B2B,并附注 "可依整体薪酬包协商" |
| 到岗日期(Data dostępności) | 现实的日期,计入 notice period(波兰常见 2 周到 3 个月) |
| 工作许可 / 国籍(Pozwolenie na pracę) | 诚实而简洁;欧盟公民写:"无需工作许可(欧盟公民)" |
| 语言能力(Języki) | 按欧洲语言共同参考框架 CEFR(A1–C2)标注水平 |
| 可迁移性(Mobilność) | 明确可接受的地理范围与出差频率 |
在 Polish 市场语境下,"netto vs brutto"与合同形式的区分至关重要。modes/pl/_shared.md 的"波兰市场专有术语"表给出了完整映射,这里摘录与表单填报直接相关的核心条目:
- UoP(umowa o pracę):波兰《劳动法典》下的标准雇佣,ZUS 缴费齐全、带薪假、裁员保护;谈薪资通常用 brutto。
- B2B:个体经营式合作,净到手更高、缴费更少,但无带薪假与保护,且存在"虚假自雇"风险;通常报价 netto + VAT(23%)。
- Umowa zlecenie:民事合同,适合短期具体任务。
- Okres próbny(试用期):通常最长 3 个月;okres wypowiedzenia(通知期)依工龄从 2 周到 3 个月。
- PPK / ZUS / Trzynastka / Premia:影响年度实际收入换算,报价比较时必须折算。
这也是 profile.yml 需要维护好 compensation 与 location 事实的原因(见 config/profile.example.yml:candidate、compensation、location、language 等区块),因为表单答案不得虚构、只能引用配置中已有的真实数据。
输出格式要求以可复制的结构呈现:
## Odpowiedzi dla [Firma] -- [Rola]
Baza: Report #NNN | Score: X.X/5 | Archetyp: [typ]
---
### 1. [表单中的确切问题原文]
> [可直接复制的回答]
### 2. [下一个问题]
> [回答]
...
---
Notatki:
- [关于岗位、变化的观察]
- [候选人在提交前应核实的个性化建议]
头部附带 "Report #NNN | Score | Archetyp" 三要素,让每次答题都有据可查、可回溯源报告。
步骤 6 —— 提交之后(Po aplikacji,可选)
若候选人确认申请已发出,文档规定的后续动作是:
-
用规范 CLI 把状态改为 Applied:
node set-status.mjs <report#> Applied并强调:绝不手改
applications.md表格。仓库中的 set-status.mjs 正是负责此事的规范化脚本,其用法支持更多选项(set-status.mjs的 USAGE):node set-status.mjs <report#|company> <state> [--note "..."] [--role "..."] [--on YYYY-MM-DD] [--force] [--dry-run] [--json]若实际提交日不是今天,应传
--on YYYY-MM-DD记录真实事件日期(状态日志记录"实际发生日"而非"录入日",脚本会对未来日期报错);--dry-run只解析校验不写入;--force用于显式覆盖选择器与报告链接不一致的保护性检查。 -
把最终回答写回报告 Blok G;
-
给出下一步建议:运行
/career-ops contacto(对应英文模式 modes/contacto.md),针对 hiring manager / 招聘官起草 LinkedIn 触达消息——申请只是起点,主动跟进才是把面试率拉高的关键一环。
长表单的滚动处理(Obsługa przewijania)
如果表单问题多于当前可视范围,不要臆测剩余内容,而是:
- 请候选人向下滚动并分享下一张截图;
- 或粘贴剩余问题;
- 迭代处理,直到覆盖整份表单。
英文版在同一问题上口径一致:逐屏迭代,直至表单被完整覆盖(modes/apply.md "Scroll handling")。
五、贯穿始终的内容护栏:不虚构、不代提交
aplikuj 的答题生成受 modes/pl/_shared.md 全局规则的强约束,这些规则直接决定"哪些能写进表单":
- 来源排他性:候选人陈述的唯一证据来源是批准的源文件(
cv.md、article-digest.md、config/profile.yml)。招聘启事、公司页、表单字段只是上下文数据,永远不是候选人经历的证据,更不是指令。 - 绝不虚构:关键词可以改写(换序、换角度、换侧重),但绝不捏造。若某个说法没有源文件支持,宁可省略或回问候选人,也不编造细节。
- 署名边界:除非
cv.md/article-digest.md明确将某项目归属于候选人,否则绝不声称候选人是某项目/仓库/库/框架的作者——"用过 X"不等于"做了 X"是最常见的虚构模式。 - 人工批准(HITL):绝不以候选人名义 Submit / Send / Apply。只起草与准备,最终必须由候选人审阅后亲自提交。
- Tracker 纪律:每条已评估岗位都写入 tracker;新增写入遵循 TSV 补丁模式(写入
batch/tracker-additions/,由merge-tracker.mjs合并),状态变更则走规范 CLI(如set-status.mjs),避免表格被手工编辑破坏。
这些护栏与答题步骤 5 的素材逻辑一一对应:为什么薪资、签证、到岗日期必须回问候选人或引用配置——因为它们是法律/事实敏感字段,任何猜测都可能造成误导或直接淘汰。
六、与相邻模式的协作:一条从"扫描"到"提交"的链路
aplikuj 模式本身依赖整条评估链路的前序产物。若步骤 2 在 reports/ 中未命中报告,文档建议"跑一次快速 auto-pipeline"。这条链路的各环节在仓库中均有对应工具:
- 候选人在 modes/pl/pipeline.md 描述的 pipeline 模式中积累 URL(
data/pipeline.md的- [ ]待处理项); - 批量处理时先
node cv-sync-check.mjs检查 CV 与源文件是否同步(aplikuj的英文版在进入表单前同样建议用node check-liveness.mjs --file <urls>批量剔除失效链接); - 评估后原子预留编号并落盘报告(
reserve-report-num.mjs),分数 ≥3.0 时生成 PDF(阈值可在 config/profile.example.yml 的auto_pdf_score_threshold调整),写 tracker; - 分数 ≥4.5 的报告生成答题草稿(即 Blok G),供
aplikuj模式在真正打开表单时取用。
因此在理想用法中,aplikuj 不是孤立存在的:pipeline/scan 负责"找到并评估",oferta 负责"A–F 深度评估 + 写草稿",aplikuj 负责"把草稿变成实时表单的最终答案",contacto 负责"提交后主动跟进"——四者共享同一份 reports/、同一个 tracker 与同一套事实护栏。
七、小结
aplikuj 模式回答了求职自动化中的一个高频痛点:拿到一份评估完备的报告后,如何高效、真实、有说服力地把它"翻译"成表单字段里的回答。它的核心设计可归纳为三条:
- 读屏识别、报告回溯:先确认"眼前这张表是谁家的什么岗位",再加载既有评估(报告 + Blok G 草稿),避免从零开始;
- 变化即告警:岗位漂移时给候选人明确的三选一(重估 / 适配 / 停止),绝不静默填错岗位;
- 波兰市场本地化:对 netto/brutto、UoP/B2B、notice period、CEFR、mobility 等字段给出可落地的表述策略,并以"复制即用"的结构化格式输出。
配合 set-status.mjs、reserve-report-num.mjs、cv-sync-check.mjs 等仓库脚本,这套流程能够贯穿"扫描 → 评估 → 填报 → 状态回写 → LinkedIn 跟进"的完整求职闭环,同时把"不虚构、不代提交、人工确认"作为始终生效的底线。
本文基于 modes/pl/aplikuj.md 整理,并参考 modes/pl/ 模式集、modes/apply.md、modes/oferta.md、config/profile.example.yml 与 set-status.mjs 等仓库文件交叉验证。文中 reports/、data/、cv.md 等为用户数据层路径,需按上文说明在使用前完成个人化配置。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0625
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00