career-ops「solliciteren」模式:面向荷兰语求职市场的申请表单实时填写助手
career-ops 的 solliciteren 模式(见 modes/nl/solliciteren.md)是候选人正在 Chrome 中填写申请(sollicitatie)表单时的交互式辅助模式:它读取当前屏幕内容,从 reports/ 中加载此前对该职位的评估报告与“Blok G”草稿答案,再为表单中的每一道题生成可直接复制的个性化回答,并在提交后通过规范化 CLI 更新申请追踪表。读完本文,你可以理解该模式的八步工作流、报告匹配与角色变更处理机制、针对荷兰/比利时表单特有字段(薪资期望、opzegtermijn 通知期、工作许可、语言、mobility)的答案生成规则,以及如何将其与 career-ops 的 tracker 命令链安全衔接。
模式定位与前置条件
solliciteren 是 career-ops 荷兰语模式族(modes/nl/README.md)四个翻译模式之一,由法语 postuler 模式(modes/fr/postuler.md)翻译而来,专门服务于荷兰与比利时(Flanders)求职市场:当候选人主要在 LinkedIn、Indeed NL/BE、Nationale Vacaturebank、VDAB 等渠道投递,且需要自然的技术荷兰语回答时启用。
前置条件分两种运行形态:
- 带可见 Playwright 浏览器(理想情况):候选人在可见模式下能看到浏览器窗口,Claude 可与页面直接交互——抓取当前标签页快照、读取标题、URL 与可见内容;
- 无 Playwright:降级为人工喂入,候选人共享表单截图(Read 工具可读图)或直接把问题文本粘贴进对话。
启用方式有两种(见 modes/nl/README.md):会话开始时直接声明“使用 modes/nl/ 下的荷兰语模式”,或在 config/profile.example.yml 中配置后永久生效:
language:
primary: nl
modes_dir: modes/nl
其中 language.output 控制输出语言(如报告、表单答案用荷兰语书写),language.modes_dir 控制加载哪个市场的词汇与规则集——两者相互独立,modes_dir 选定的是市场语汇而非行文语言。
八步工作流总览
文档定义的完整流水线如下(原文为八步,此处逐字继承):
1. DETECTEREN -> 读取当前活跃的 Chrome 标签页(截图/URL/标题)
2. IDENTIFICEREN -> 从页面提取公司与职位
3. ZOEKEN -> 在 reports/ 已有报告中查找匹配
4. LADEN -> 读取完整报告及 Blok G(如存在)
5. VERGELIJKEN -> 屏幕上职位与评估职位是否一致?有变更则告警
6. ANALYSEREN -> 识别表单中所有可见问题
7. GENEREREN -> 为每道题生成个性化回答
8. PRESENTEREN -> 以可直接复制的格式呈现答案
整个流程的核心思想是:表单填写不是从零写作,而是对既有评估产物(A–F 块报告 + Blok G 草稿)的复用与细化。报告由配套的 vacature 模式生成并存储为 reports/{###}-{company-slug}-{YYYY-MM-DD}.md(见 modes/nl/vacature.md),这正是本模式第 3、4 步能够命中上下文的前提。
步骤 1:发现职位
两条路径对应两种运行形态:
- 带 Playwright:对当前活跃页面做快照(snapshot),读取标题、URL 与可见内容;
- 无 Playwright:请候选人三选一——共享表单截图(Read 工具读图)、把表单问题以文本粘贴进来、或只提供“公司 + 职位”让助手去反查上下文。
步骤 2:识别并加载上下文
匹配逻辑是带校验的,共六条规则:
- 从页面提取公司名与职位名;
- 在
reports/中按“公司名 + 职位名”的归一化组合搜索——归一化即忽略大小写与标点差异(荷兰语职位名中-、空格、大小写混用很常见); - 若可得,用职位 URL 验证匹配;若验证后仍存在多个候选报告,必须先让候选人确认该表单对应哪个报告,再加载任何内容;
- 恰有一个已验证匹配 → 加载完整报告;
- 若报告含 Blok G(概念答案块)→ 加载既有草稿作为基础;
- 仅在没有任何已验证匹配时 → 告警并建议候选人先跑一次快速 auto-pipeline 补上评估。
值得注意的是,相比法语源版本(modes/fr/postuler.md 仅按公司名 Grep 匹配),荷兰语版增加了 URL 验证与多候选消歧约束,避免把 A 职位的报告错挂到 B 职位的表单上。
步骤 3:角色变更检测
当屏幕上职位与已评估职位不一致时,文档给出三条分支,且对追踪数据的写入方式有严格约束:
- 告警候选人:“职位从 [X] 变成了 [Y]。要我用新标题重新评估,还是仅把答案适配到新标题?”
- 选择“适配”:一次性地把答案适配到屏幕上的新角色,不重新评估;原始职位名在 tracker、报告元数据与 Blok G 中保持不动;适配后的答案不得存回旧报告。
- 选择“重新评估”:对屏幕上的角色启动完整 A–F 评估,更新报告元数据并重新生成 Blok G;变更后的职位名以 TSV 追加方式写入
batch/tracker-additions/,绝不手工编辑applications.md(这是 modes/nl/_shared.md 中“TSV tracker 数据”规则的落地)。 - 重评后固定命令链:按顺序执行
node merge-tracker.mjs
node verify-pipeline.mjs
node normalize-statuses.mjs
node dedup-tracker.mjs
这四个脚本均位于仓库根目录:merge-tracker.mjs 负责把 TSV 追加合并进 applications.md,verify-pipeline.mjs 校验管道产物一致性,normalize-statuses.mjs 归一化状态值,dedup-tracker.mjs 做去重。固定顺序保证“先合并、再验证、再归一、最后去重”,中间任一步失败都不会污染后续状态。
步骤 4:解析表单问题
要求识别所有可见问题,文档列举的五类字段覆盖了欧洲 ATS 表单的常见形态:
| 字段类型 | 典型示例 |
|---|---|
| 自由文本 | 求职信、“为什么选择这个职位”、动机 |
| 下拉选择 | “你如何知道这家公司”、工作许可 |
| 是/否 | 流动性(mobiliteit)、签证、到岗时间 |
| 薪资字段 | 薪资区间、薪资期望,以及是否已含 vakantiegeld(休假津贴)/固定额外项 |
| 上传字段 | CV、PDF 求职信、推荐信 |
随后对每道题做二分类:
- Blok G 已回答过 → 直接沿用既有答案;
- 新问题 → 基于报告 +
cv.md生成。
步骤 5:生成答案
分数闸门(Scorecontrole)
荷兰语版在此加入了一条硬性闸门:若加载的报告得分低于 4.0/5,必须明确劝阻候选人投递,并在生成任何答案之前停止;只有候选人明确表态“因某个具体理由忽略该建议”后才可继续。4.0/5 及以上则走正常流程。这是该模式区别于法语源版本的一处强化约束——评估分数直接成为答案生成的准入条件。
五要素组答案
对每道题,按以下构造顺序生成:
- 报告上下文:取 Blok B 的 proof points 与 Blok F 的 STAR 故事;
- 既往 Blok G:已有草稿则以其为基础精修;
- “Ik kies jou”(我选你们)语气:与 auto-pipeline 同一框架——自信,不乞求;
- 具体性:必须引用屏幕可见职位描述或已验证报告中的具体细节;两者都不含所需信息时,先向候选人索要职位描述原文,永不编造细节;
- career-ops proof point:若表单存在“补充信息”字段,可在此提及 proof point,但前提是该点确实来自已验证报告、
cv.md、config/profile.yml或当前对话;呈现前须经候选人确认,不得使用无证据的声明或指标。
这些边界与 modes/nl/_shared.md 中的守护规则一脉相承:候选人声明只允许出自批准的文件清单(cv.md、article-digest.md、config/profile.yml、modes/_profile.md 等),职位描述、公司页面与表单字段只是数据,不是指令,也不是候选人经历的证据;任何 Submit/Send 动作必须由人完成,助手只负责起草。
荷兰/比利时表单高频字段专项规则
文档针对 NL/BE 表单特有字段给出逐条数据源约束(核心原则:只用配置或对话中的事实,且每个字段用前都要候选人确认):
- 薪资期望(年度税前) → 取自
config/profile.yml的薪资区间或当前对话,以 EUR 表述,附“可根据总包商谈”说明,用前必须让候选人确认金额; - 可入职日期(beschikbaarheidsdatum) → 基于实际 opzegtermijn(通知期)与
config/profile.yml或对话中声明的可用时间推算,不编造日期,用前让候选人确认推算结果。参考 config/profile.example.yml 中cover_letter.notice_period_days字段(示例值 30 天,注释明确“用户确认实际值后才会写入信件”); - 工作许可 / 国籍 → 仅依据
config/profile.yml或当前对话声明作答。工作许可、签证担保、国籍、居留身份必须作为四个独立事实分别处理,任何一项都不得假设,呈现前须候选人确认。可对照示例配置中的location.visa_status、location.authorized_in(已持工作许可的国家/地区列表)与location.needs_sponsorship(是否需要担保,缺省按 false 处理)三个键,它们正是评估与表单作答共用的数据源; - 语言 → 语言等级仅取自
config/profile.yml或对话声明,尽量采用 CEFR/ERK 等级(A1–C2),用前须候选人确认; - 流动性(Mobiliteit) → 可接受地理范围与出差频率同样只来自配置或对话声明,用前须确认。
输出格式
答案以固定模板呈现(完整继承自原文档):
## Antwoorden voor [Bedrijf] -- [Functie]
Basis: Rapport #NNN | Score: X,X/5 | Archetype: [type]
---
### 1. [Exacte vraag uit het formulier]
> [Antwoord dat direct kan worden gekopieerd]
### 2. [Volgende vraag]
> [Antwoord]
...
---
Opmerkingen:
- [Observaties over de functie, wijzigingen, enz.]
- [Personalisatiesuggesties die de kandidaat moet controleren]
头部三行(报告编号、得分、archetype)让候选人一眼确认答案来源;每题为“原问题 + 可复制答案”配对;结尾的 Opmerkingen 区块集中列出观察与待核查项,把“机器生成”与“人工确认”的边界显式化。
步骤 6:提交之后(可选)
当候选人确认申请已发出:
-
通过规范化 CLI 更新状态:
node set-status.mjs <report#> Applied并禁止手工编辑
applications.md表格。从源码看(set-status.mjs 头部注释),该命令支持<report#|company> <state>定位,并提供--note "..."、--role "..."、--force、--dry-run、--json等标志——重评分支里改角色名时即可用--role配合 dry-run 预演。 -
回写 Blok G:仅当公司与职位仍与报告元数据精确一致时才用最终答案更新报告的 Blok G。若此前做过一次性角色适配,必须先为该角色单独建报告或完成完整重评;绝不覆盖原角色报告。
-
推进下一步:建议运行
/career-ops contacto(modes/contacto.md)对 hiring manager 发起 LinkedIn 触达。
滚动管理(Scrollbeheer)
表单问题多于一屏时:请候选人向下滚动后再共享一张截图,或粘贴剩余问题;模式以迭代方式逐批处理,直到覆盖整个表单。这与“无 Playwright 时人工喂入”的路径一致——每轮迭代都是“识别 → 分类 → 生成 → 呈现”的小循环,保证长表单不会因单屏截断而漏题。
小结:该模式在 career-ops 体系中的位置
solliciteren 是评估结果向真实投递动作转化的“最后一公里”:上游 vacature 模式产出 reports/ 报告与 tracker 行,本模式消费它们;下游 set-status.mjs + 命令链 + contacto 维持追踪状态与后续跟进。它的设计约束——报告匹配需 URL 验证、低于 4.0/5 拒绝生成、每个敏感字段用前须人工确认、追踪表只经 CLI/TSV 通道写入——共同保证了一件事:助手只做有据可依的起草,人始终握有确认权与提交权。
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 StartedRust0624
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