{"id":"5bbb8665-e6a4-4ede-9d69-fb7814165991","entityType":"agent","slug":"clawhub-huagavin-boss-zhipin-copilot","name":"BOSS直聘仿人求职助手","canonicalUrl":"https://www.xpersona.co/agent/clawhub-huagavin-boss-zhipin-copilot","canonicalPath":"/agent/clawhub-huagavin-boss-zhipin-copilot","generatedAt":"2026-10-09T23:25:09.938Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T17:41:37.383Z","emptyReason":null},"description":"通用 BOSS 直聘求职 copilot：配合仿真人浏览器后端用真实光标安全检索/收藏岗位、读 JD、写破冰话术并按授权发送。强制走后端正门、真实光标、限速、撞墙停手、授权门控，绝不裸 CDP。四类资产（脚本/选择器/页面/点位）一律优先复用 skill 内置，禁止现写等价脚本或重猜选择器；新建前必查 script_catalog.md + boss_selectors.md。 Skill: BOSS直聘仿人求职助手 Owner: huagavin Summary: 通用 BOSS 直聘求职 copilot：配合仿真人浏览器后端用真实光标安全检索/收藏岗位、读 JD、写破冰话术并按授权发送。强制走后端正门、真实光标、限速、撞墙停手、授权门控，绝不裸 CDP。四类资产（脚本/选择器/页面/点位）一律优先复用 skill 内置，禁止现写等价脚本或重猜选择器；新建前必查 script_catalog.md + boss_selectors.md。 Tags: latest:0.1.0 Version history: v0.1.0 | 2026-08-09T13:57:24.485Z | auto boss-zhipin-copilot v0.1.0 - Initial public release of a configurable, open-source BOSS Zhipin job search c","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 2.2K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s179vrt2zv80p4y7g1hnkzrj1d8779gn:boss-zhipin-copilot","sourceUrl":"https://clawhub.ai/huagavin/boss-zhipin-copilot","homepage":"https://clawhub.ai/huagavin/skills/boss-zhipin-copilot","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/huagavin/boss-zhipin-copilot","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/huagavin/skills/boss-zhipin-copilot","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":67,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"通用 BOSS 直聘求职 copilot：配合仿真人浏览器后端用真实光标安全检索/收藏岗位、读 JD、写破冰话术并按授权发送。强制走后端正门、真实光标、限速、撞墙停手、授权门控，绝不裸 CDP。四类资产（脚本/选择器/页面/点位）一律优先复用 skill 内置，禁止现写等价脚本或重猜选择器；新建前必查 script_c"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:41:37.383Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:41:37.383Z","emptyReason":null},"stars":null,"forks":null,"downloads":2192,"packageName":null,"latestVersion":"0.1.0","tractionLabel":"2.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:41:37.382Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T17:41:37.383Z","lastCrawledAt":"2026-10-09T17:41:37.382Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T17:41:37.382Z","lastVerifiedAt":null,"highlights":[{"version":"0.1.0","createdAt":"2026-08-09T13:57:24.485Z","changelog":"boss-zhipin-copilot v0.1.0 - Initial public release of a configurable, open-source BOSS Zhipin job search copilot. - Enables secure, real-cursor automation for job searching, collecting, reading JDs, composing icebreaker messages, and sending as authorized. - Enforces strict backend usage: only supports agent-browser-runtime, never direct CDP or browser extensions. - All script/selectors/pages/positions must reuse built-in assets; adding new assets requires metadata registration. - Includes robust safety protocols: authorization gating, rate limits, real-cursor actions only, anti-cheat/anti-bot safeguards, and workflow recovery rules. - Introduces a modular workflow: resume/profile parsing → intent/filters → job search/library → JD extraction → icebreaker drafting.","fileCount":41,"zipByteSize":104053}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s179vrt2zv80p4y7g1hnkzrj1d8779gn:boss-zhipin-copilot","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-huagavin-boss-zhipin-copilot/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-huagavin-boss-zhipin-copilot/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-huagavin-boss-zhipin-copilot/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-huagavin-boss-zhipin-copilot/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-huagavin-boss-zhipin-copilot/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-huagavin-boss-zhipin-copilot/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T23:25:09.936Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-huagavin-boss-zhipin-copilot/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-huagavin-boss-zhipin-copilot/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-huagavin-boss-zhipin-copilot/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-huagavin-boss-zhipin-copilot/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-09T17:41:37.383Z","emptyReason":null},"readme":"Skill: BOSS直聘仿人求职助手\n\nOwner: huagavin\n\nSummary: 通用 BOSS 直聘求职 copilot：配合仿真人浏览器后端用真实光标安全检索/收藏岗位、读 JD、写破冰话术并按授权发送。强制走后端正门、真实光标、限速、撞墙停手、授权门控，绝不裸 CDP。四类资产（脚本/选择器/页面/点位）一律优先复用 skill 内置，禁止现写等价脚本或重猜选择器；新建前必查 script_catalog.md + boss_selectors.md。\n\nTags: latest:0.1.0\n\nVersion history:\n\nv0.1.0 | 2026-08-09T13:57:24.485Z | auto\n\nboss-zhipin-copilot v0.1.0\n\n- Initial public release of a configurable, open-source BOSS Zhipin job search copilot.\n- Enables secure, real-cursor automation for job searching, collecting, reading JDs, composing icebreaker messages, and sending as authorized.\n- Enforces strict backend usage: only supports agent-browser-runtime, never direct CDP or browser extensions.\n- All script/selectors/pages/positions must reuse built-in assets; adding new assets requires metadata registration.\n- Includes robust safety protocols: authorization gating, rate limits, real-cursor actions only, anti-cheat/anti-bot safeguards, and workflow recovery rules.\n- Introduces a modular workflow: resume/profile parsing → intent/filters → job search/library → JD extraction → icebreaker drafting.\n\nArchive index:\n\nArchive v0.1.0: 41 files, 104053 bytes\n\nFiles: .gitignore (1023b), assets (0b), assets/example_profile.yaml (2588b), assets/profile_template.yaml (1818b), assets/target_library_template.csv (150b), CHANGELOG.md (6902b), LICENSE (1074b), README.md (15923b), references (0b), references/boss_selectors.md (11830b), references/browser_backend.md (6013b), references/cooldown_config.md (2831b), references/profile_schema.md (4700b), references/safety_rules.md (10653b), references/script_catalog.md (7303b), references/target_library_schema.md (2575b), requirements.txt (101b), scripts (0b), scripts/audit_icebreaker.py (8299b), scripts/backends (0b), scripts/backends/_deprecated (0b), scripts/backends/_deprecated/cloak.sh (2438b), scripts/backends/_deprecated/codex.sh (6186b), scripts/backends/brs.sh (4959b), scripts/build_profile.py (4293b), scripts/common.sh (11936b), scripts/filter_library.py (11813b), scripts/intent_filters.py (15510b), scripts/parse_job.py (4807b), scripts/parse_search.py (3572b), scripts/preflight_env.sh (2860b), scripts/process_job.sh (10217b), scripts/run_py.sh (747b), scripts/scan_chat.sh (1870b), scripts/search_jobs.sh (8353b), scripts/setup_library.sh (610b), scripts/strip_title.py (1174b), scripts/zhipin-chat.extract.js (4267b), skill-card.md (2937b), SKILL.md (20620b), _meta.json (138b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: boss-zhipin-copilot\nversion: 1.0.4\ndescription: >-\n  通用 BOSS 直聘求职 copilot：配合仿真人浏览器后端用真实光标安全检索/收藏岗位、读 JD、写破冰话术并按授权发送。强制走后端正门、真实光标、限速、撞墙停手、授权门控，绝不裸 CDP。四类资产（脚本/选择器/页面/点位）一律优先复用 skill 内置，禁止现写等价脚本或重猜选择器；新建前必查 script_catalog.md + boss_selectors.md。\n---\n\n通用、可配置、开源的 BOSS 直聘求职 copilot：把「简历 + 求职目标」沉淀为可复用能力——自动建岗位画像与检索词、建评分机制、建岗位库、检索收藏、写破冰话术、按授权发送。\n\n> 🔌 **应用层架构**：浏览器运行时由「仿真人浏览器后端」经 `bz_*` 契约即插即用提供。默认**且仅支持** [agent-browser-runtime](https://github.com/energypantry/agent-browser-runtime)（受控 Chromium + 自带 companion 模拟真实光标）。**所有浏览器动作只经后端正门真实光标执行，绝不直连 CDP、绝不走浏览器扩展直控。**\n\n**流水线**：`简历/目标` → `profile.yaml` → 检索·过滤·入库 → 读 JD → 写话术（自检 gate）→ 授权发送 / 仅本地成稿\n\n> 🛑 **最高优先级前置门控**：任何写脚本 / 猜选择器·页面·点位前，**必须先 `Read references/script_catalog.md` + `references/boss_selectors.md`**（统一原则见下方「🛑 优先复用与增量更新」）。已有对应项时现写即违规——立即停用，改用内置。复用优先于一切。\n\n---\n\n## 何时使用\n- 用户在 BOSS 直聘「找工作 / 建目标岗位库 / 批量收藏 / 写破冰话术 / 发消息」。\n- 触发语：「帮我在 BOSS 找策略产品经理」「根据简历生成求职画像和检索词」「收藏这几个岗位」「写破冰话术」「把这些岗发消息」。\n\n---\n\n## 前置依赖（缺一不可 → fail loud）\n1. **仿真人浏览器后端就绪**（关键准入，裸 CDP / 扩展直控曾致封号）：\n   - 本地（默认且唯一 sanctioned）：部署 [agent-browser-runtime](https://github.com/energypantry/agent-browser-runtime)，`BZC_BACKEND=brs`（默认），`brs status` 须 `extensionConnected: true`。\n   - 缺失 → `common.sh` fail-loud 并贴安装链接。契约见 `references/browser_backend.md`。\n2. **Python3 + PyYAML（硬前置，加载即校验）**：`pip install -r requirements.txt`。`common.sh` 在 source 时即经 `resolve_python()` + `preflight_env.sh` 断言「选中的解释器能 `import yaml`」；PyYAML 缺失直接 **FAIL_LOUD**（不再静默选到缺 yaml 的解释器让解析脚本确定性失败）。未设 `PYTHON` 时按 `PATH(win-native) > 受管 3.13.12 > 受管 venv(envs/default，预装 yaml) > python3` 自动挑第一个带 yaml 的；显式 `PYTHON` 则严格遵从。\n3. **执行环境就绪度（Axis B 预检/引导层）**：`preflight_env.sh` 兜底 coreutils——Git Bash 等会话级环境缺 `sleep`/`seq` 时自动注册等价 shell 函数（零磁盘写入）；脚本路径转换已统一改用 `to_win_path`，不再散落裸 `cygpath -w`（消除「cygpath 缺失 → 静默回退 POSIX 路径 → win-python 误读」的确定性失败）。\n4. **profile.yaml / 岗位库 CSV**：由本 skill 在工作流 Step 0/1 自动生成（无需预置）。\n\n> 🔴 **反作弊红线（R12，硬性）**：BOSS 直聘禁止**任何 Agent** 的浏览器扩展直控（含 Codex `@Chrome` / CloakBrowser 之类）。本 skill **统一 brs 单后端**（agent-browser-runtime 受控运行时）；设 `BZC_BACKEND=codex|cloak` 会被 `common.sh` 直接拒绝（`exit 1` + 安装链接）。公开仓库不收录任何扩展直控后端。\n\n> ⚠️ **运行方式护栏（防绕过原生 Axis B 层）**：跑批时**只设连接变量**——`AGENT_BROWSER_RUNTIME_HOME`（或 `BRS_JS`）+ 必要时 `NODE`（受管 node 绝对路径，如 `$HOME/.workbuddy/binaries/node/versions/<ver>/node`，WorkBuddy 专属示例）。**严禁预置 `PYTHON`、严禁 `source` 任何外部 `runtime_env.sh` / 类似 shim**：那会把 `PYTHON`/cygpath/sleep 写死，绕过本 skill 的 `resolve_python` / `to_win_path` / `preflight_env.sh`，导致\"测的根本不是 skill 本身\"。PyYAML 解析、POSIX→Windows 路径转换、coreutils 兜底**一律由 skill 自供**。\n\n---\n\n## 安全纪律（灵魂 · 全文见 references/safety_rules.md）\n- **R1** 只走仿真人浏览器后端正门，绝不裸 CDP / `Runtime.evaluate` / 查询串捷径。\n- **R2** 只用真实光标（`ui.click`/`ui.type`），禁合成点击。\n- **R3** 限速：动作间隔 ≥`ACTION_INTERVAL_SECONDS`(5s)；每日收藏+开聊 ≤`DAILY_CAP`(100)。\n- **R4** 撞墙即停：验证码/滑块 → `exit 3`，停手交人工，冷却 ≥24h，绝不恢复自动化。\n- **R5** 授权门控：书签需批次授权；发消息需**每岗** `AUTHORIZED=1`。门控在 `process_job.sh` 顶部最早执行，未授权带 `--send`/`--bookmark` 直接 `exit 4`。\n- **R6** 合并打开，避免无谓重开（同次任务合并书签+读JD+授权发送）。\n- **R7** 预飞 1 岗跑通整条路径，再复制其余。\n- **R8** 单 lease 连续 tab，批量不杀重启（burst）。\n- **R9** 复核收敛：每步仅 1 个权威产物，最多 1 次交叉校验。\n- **R10** 发送幂等 / 防重复：批量发送必须有 done 唯一真源 + key 归一化 + 文件内存双写 + 并发锁 + 启动即停（见下方 Step 5 模板），否则中断重跑会重复发。\n- **R11** 登录态失败驱动：默认信任已登录，仅在「搜 0 结果且登录页信号」或「发送未确认且登录页信号」时按需 `check_logged_in`；命中即置 `logged_out` + `exit 8`，绝不主动预飞。\n- **R12** 反作弊红线：只允许受控运行时（agent-browser-runtime 类），禁止任何 Agent 的浏览器扩展直控（含 Codex `@Chrome` / CloakBrowser）；`BZC_BACKEND=codex|cloak` 会被 `common.sh` 直接拒绝。\n- ⚠️ 禁止频繁开关 tab / 本地打开 BOSS HTML / 盲坐标点击。\n\n---\n\n## 🛑 优先复用与增量更新（Reuse-First & Incremental Update · 最高优先级）\n\n> 本 skill 预建了全部资产（**脚本 / 选择器 / 页面 / 点位**），目的就是让 Agent 不再现写或盲猜——那既是误差之源也是低效之源。四类资产统一遵循同一原则：\n\n- **① 复用优先**：动手前先查已有资产——\n  - 脚本 → `references/script_catalog.md`（任务 → 内置命令精确映射）\n  - 选择器 / 页面 / 点位 → `references/boss_selectors.md`\n  - 凡已有对应条目，**必须直接复用**：禁止重写等价脚本、禁止重猜选择器、禁止盲试页面 URL、禁止自造点位。\n- **② 发现错误 → 就地更新**：已有条目实测漂移 / 失效，**直接改对应条目**（fix-in-place）惠及所有未来运行；**禁止绕过**（绕过 = 误触 / 误判，见 R1）。\n- **③ 发现新内容 → 补进对应位置**：\n  - 新脚本 → 收编 `scripts/` + 登记 `script_catalog.md`\n  - 新选择器 / 页面 / 点位 → 补进 `boss_selectors.md` 对应节（标注「首次校验」）\n- **④ 受控逃逸阀**：仅当确属全新、与现有资产无重叠才新建；新建必登记；**无法说清「为何现有不适用」时，默认就地改，不得新建**。任务执行中**禁止临时改写 `process_job.sh` 等内置脚本绕过门控**——源码修改走 skill 维护流程（改后 commit）。\n\n## 工作流\n### Step 0 · 生成 / 校验 profile + 解析求职意图\n- `bash scripts/run_py.sh build_profile.py --goal \"...\" [--resume 简历.md] --out profile.yaml` 抽草稿；Agent 复核补全 `hard_exclude` / `boost_keywords` / `fact_anchors`（依据 `references/profile_schema.md`）。解析不出的维度保守留空（=不限），必要时追问 1 个关键问题。→ **产物 `profile.yaml`**（后续唯一输入）。（复用 `build_profile.py`，禁现写等价脚本）\n- **主动解析求职意图（长期能力）**：用户常以自然语言提需求（如\"想找一家 B 轮以上的中型公司做后端开发\"\"北京全职20k以上5年经验\"）。这类隐含的筛选条件**必须由 `scripts/intent_filters.py` 自动识别并映射到 BOSS 搜索页筛选器**，**优先在搜索阶段应用**，缩小结果范围，避免下游读大量不符岗 JD。用法：\n  - `bash scripts/run_py.sh intent_filters.py parse \"自然语言\" [--profile profile.yaml]` → 解析出 FilterSpec（意图覆盖 profile 默认）\n  - `bash scripts/run_py.sh intent_filters.py build --profile profile.yaml [--intent \"文本\"] [--scale 302,303] [--exp 106] ...` → 合并 profile+意图+显式维度覆盖 → 最终 FilterSpec\n  - 编码映射与点位见 `references/boss_selectors.md` 五「结果页筛选器」（六维度全覆盖：公司规模/融资阶段/工作经验/学历要求/薪资待遇/求职类型）。**复用内置，禁现写等价解析。**\n\n### Step 1 · 建 / 校验岗位库\n`bash scripts/setup_library.sh` 生成空 `target_library.csv`（`$LIB_CSV` 可指定）。本库是检索/去重/入库的**唯一权威数据源**（`references/target_library_schema.md`）。（复用 `setup_library.sh`，禁现写）\n\n### Step 2 · 检索（先筛选）→ 过滤 → 书签入库\n> **🔒 流程铁律：筛选优先于后续操作。** 先按筛选条件在「搜索结果页」源头过滤 → 再对过滤后的岗位列表执行收集/详情抓取/匹配分析。绝不让未过筛的岗位进入下游（读 JD / 写话术 / 入库），那会成倍浪费真实光标动作。\n\n1. **检索收集（源头筛选 + 只读）**（复用内置，禁自写）：\n   `bash scripts/search_jobs.sh --profile profile.yaml --out .work/candidates.csv [--intent \"自然语言意图\"] [--scale \"302,303\"] [--stage 804,805] [--exp 106] [--degree 203] [--salary 406] [--jobtype 1901]`\n   - 查询词取自 `profile.search.queries`（或 `--queries \"词1,词2\"`）；走 `bz_*` 真实光标、复用同 tab、**禁 `?query=&city=&page=` 捷径**。\n   - **六维度筛选在搜索结果页源头应用（核心优化）**：搜索框下方 hover 出下拉、复选（点位/编码见 `boss_selectors.md` 五）。筛选来源优先级：① `profile.thresholds` 默认（scale_min/max、salary_floor、seniority_years 自动推导）→ ② `--intent \"文本\"` 自动解析隐含条件（如\"B轮以上中型公司\"）覆盖同名维度 → ③ 显式 `--scale/--stage/--exp/--degree/--salary/--jobtype` 最高优先级覆盖。**在源头筛掉不符岗，比读 JD 详情页后再筛高效得多**（实测：下游 JD 阅读量可降 30–50%）。\n   - 产 `candidates.csv`（列：岗位名/公司名/城市/经验要求/URL）。⚠️ **无薪资列**——卡片薪资被字体反爬混淆，须 Step 3 从 JD 详情页取。\n2. **过滤打分去重**（复用 `filter_library.py`，禁现写）：`bash scripts/run_py.sh filter_library.py --profile profile.yaml --input .work/candidates.csv --out .work/eval.json`\n   - **省略 `--library` = 只读候选清单、不入库**；通过项在 `eval.json.passed`，Top-N 自行按「评分」截断。\n   - 确需入库再加 `--library target_library.csv`（通过项追加，状态=已收藏(感兴趣)，按 URL 去重）。\n3. 逐岗书签：`AUTHORIZED=1 bash scripts/process_job.sh --url <岗URL> --bookmark`（复用 lease：`--lease <id> --tab <id>`）。\n   - 核对实际收藏：个人中心「感兴趣」tab（`https://www.zhipin.com/web/geek/recommend`，见 `boss_selectors.md` 六，**只读**，勿在此页改状态）。列表页**每卡另有 `a.btn-startchat` 可直接开聊**，卡片 DOM 结构见 `boss_selectors.md` 六「收藏列表卡片 DOM」。\n4. 预飞 1 岗跑通选择器 → 同路径复用；按 `references/cooldown_config.md` 间隔；撞墙即停。\n\n### Step 3 · 读 JD / 招聘方\n单岗：`bash scripts/process_job.sh --url <岗URL> --read-jd --out recruiter_jd.json`（`<岗URL>` 用 `https://www.zhipin.com/job_detail/<jid>.html`，**去掉 `?securityId=...`**，见 `boss_selectors.md` 六/三）→ 解析 `.job-boss-info .name`（真实招聘方，**非登录账号**）/ `.job-sec-text`（完整 JD）/ `.sider-company`。读 JD 前用 `bz_wait $BZ_LEASE $BZ_TAB job-sec-text` 等渲染就绪，避免空串（见 `safety_rules.md` 十）。\n**批量（N 岗）禁止另写 `read_jd_batch.py`** → shell 循环复用单岗命令（白赚真实光标 + 撞墙检查 + 解析）：\n`for u in $(cat urls.txt); do bash scripts/process_job.sh --url \"$u\" --read-jd --out .work/jd_$((++n)).json; done`\n**输出契约**：每岗产出单元素 JSON 列表 `[{id,title,jd,recruiter,company}]`；合并为批量数组即话术**唯一 JD 依据**（见 `audit_icebreaker.py` 用法）。\n\n### Step 4 · 写破冰话术（通用）\n1. **JD 洞察**：1–2 句复述具体业务点，含 ≥3 个 JD 原文 distinctive 词。\n2. **事实匹配**：从 `profile.fact_anchors` 取凭据，每段「公司+动作+数字」、可溯源、无编造。\n3. **话术**（≤200 字）：真实招聘方称呼 + JD 共鸣 + 事实凭据 + 诚实边界。\n4. **自检 gate**：`bash scripts/run_py.sh audit_icebreaker.py recruiter_jd.json 话术.md 事实库.md keys.json` 要求 **JD≥90% 且 事实≥90%**（keys 由 Agent 为每岗写 `jd/fact` 锚点，写即强制精读）。不达标 → 重写。\n5. 完成即**停等用户审核**，不自动发送。\n\n### Step 5 · 发送或仅本地（授权门控）\n- 用户**每岗**显式授权（`AUTHORIZED=1`）→ `bash scripts/process_job.sh --url <岗URL> --send --msg 话术.txt` 真实光标发送（发送前校验对话列表已有我方内容、称呼/岗位一致）。\n- ⚠️ **须前台、逐岗、人工实时在环执行，禁止委托无人值守后台批量跑**（即便已授权）：撞墙无人接手 / 无法中断 / 会话结束即死。仅只读操作可后台（见 `safety_rules.md` 红线）。\n- 未授权 → 仅产出本地文档（如 `破冰沟通YYYYMMDD.md`），**不发送**。\n- **批量发送（断点续发安全 · 必须遵守 `references/safety_rules.md` R10）**：多岗授权发送用**幂等编排循环**，**禁止裸 `for` 循环不带 done 追踪**（中断重跑会重复发）。官方模板（done 唯一真源 + key 归一化 + 文件内存双写 + 并发锁 + 启动即停）：\n  ```bash\n  DONE=\".work/send_done.txt\"; LOCK=\".work/.send_lock\"\n  mkdir \"$LOCK\" 2>/dev/null || { echo \"另一个发送实例正在运行\"; exit 1; }\n  trap 'rmdir \"$LOCK\" 2>/dev/null' EXIT\n  declare -A DONESET\n  [ -f \"$DONE\" ] && while read -r d; do d=\"${d%$'\\r'}\"; [ -n \"$d\" ] && DONESET[\"$d\"]=1; done < \"$DONE\"\n  # urls.txt: 每行 <jid><TAB><url><TAB><薪资>\n  while IFS=$'\\t' read -r jid url sal; do\n    [ -z \"$jid\" ] && continue\n    jid=\"${jid%$'\\r'}\"\n    [ \"${DONESET[$jid]:-}\" = \"1\" ] && { echo \"[skip] $jid\"; continue; }\n    AUTHORIZED=1 bash scripts/process_job.sh --url \"$url\" --send --msg \".work/msg/$jid.txt\" \\\n      || { echo \"发送失败/撞墙 $jid，停手\"; break; }\n    printf '%s\\n' \"$jid\" >> \"$DONE\"   # 文件落盘（显式 LF）\n    DONESET[\"$jid\"]=1                  # 内存同步（同跑内防重）\n  done < urls.txt\n  ```\n  - done 文件须**显式 LF**（`printf '%s\\n'`，绝不写 `\\r`）；加载 / 比较均剥 `\\r` → 杜绝 CRLF/LF 混行分裂 key（R10 事故根因）。\n  - 同跑内文件+内存双写保证不重发；并发锁杜绝双实例；done 覆盖全部则循环自然跳过全部（启动即停）。\n  - 仍逐岗走 `process_job.sh`（R5 每岗授权门控不绕过）、前台人工在环、撞墙即停（R4）。\n\n### Step 6 · 扫描聊天列表（可选）\n`bash scripts/scan_chat.sh` 调 `zhipin-chat.extract.js` 取快照，与 `target_library.csv` 按 (name,company,role) 交叉比对，判已发/去重。**只读，不改状态**。（复用，禁现写）\n\n---\n\n## 脚本清单\n| 脚本 | 用途 |\n|---|---|\n| `scripts/common.sh` | 被 source：后端探测 + `source backends/$BZC_BACKEND.sh` + fail-loud + 撞墙/冷却助手 + `to_win_path` + 加载预检层 |\n| `scripts/preflight_env.sh` | 环境预检/引导层（Axis B）：防御性确认 PyYAML 可用 + `sleep`/`seq` 缺失时注册会话级 shell 函数兜底（路径转换统一走 `to_win_path`，无 cygpath shim） |\n| `scripts/backends/brs.sh` | 唯一后端：agent-browser-runtime（local，已实现，受控 Chromium + companion 真实光标） |\n| `scripts/backends/_deprecated/codex.sh` | ⛔ 已废弃：Codex @Chrome 扩展直控（反作弊风险，勿用于 BOSS） |\n| `scripts/backends/_deprecated/cloak.sh` | ⛔ 已废弃：CloakBrowser 扩展直驱（反作弊风险，勿用于 BOSS） |\n| `scripts/setup_library.sh` | 初始化空岗位库 CSV |\n| `scripts/search_jobs.sh` | 多词检索：复用同 tab、只读收集结果卡 → `candidates.csv` |\n| `scripts/parse_search.py` | 搜索结果卡片解析（search_jobs 内部调用；不含薪资） |\n| `scripts/process_job.sh` | 单岗：书签/读JD/发消息（可复用 lease） |\n| `scripts/scan_chat.sh` | 扫描聊天列表（只读，不改状态） |\n| `scripts/zhipin-chat.extract.js` | 聊天列表提取器（broker 端执行） |\n| `scripts/build_profile.py` | 目标句 → profile 草稿 |\n| `scripts/filter_library.py` | profile 驱动过滤 + 评分 + 入库 |\n| `scripts/audit_icebreaker.py` | 破冰话术自检 gate（JD≥90% + 事实≥90%） |\n| `scripts/parse_job.py` | 读JD 的 HTML DOM 解析（process_job 内部调用） |\n\n> 📌 **复用前必查 `references/script_catalog.md`**：任务 → 内置脚本精确命令映射 + 反模式清单。凡表中有脚本必须复用，禁止重写（见上方「🛑 优先复用与增量更新」）。\n\n---\n\n## 环境变量\n| 变量 | 默认 | 说明 |\n|---|---|---|\n| `BZC_BACKEND` | `brs` | 后端：仅 `brs`（agent-browser-runtime，受控运行时）。设 `codex`/`cloak` 会被 `common.sh` 拒绝（R12 反作弊） |\n| `BRS_JS` | 自动探测 | brs.js 路径（或 `AGENT_BROWSER_RUNTIME_HOME` 辅助） |\n| `NODE` / `PYTHON` | `node` / `python3` | 可执行 |\n| `PROFILE` | `./profile.yaml` | profile 文件 |\n| `LIB_CSV` | `./target_library.csv` | 岗位库 CSV |\n| `WORK_DIR` | `./.work` | 中间产物目录 |\n| `AUTHORIZED` | `0` | 发消息/书签授权（=1 才允许） |\n| `ACTION_INTERVAL_SECONDS` | `5` | 动作间隔下限 |\n| `COOLDOWN_JITTER` | `3` | 间隔随机抖动幅度（±秒，防机器特征） |\n| `BACKOFF_MAX` | `60` | 软限流指数退避上限（秒） |\n| `DAILY_CAP` | `100` | 每日收藏+开聊上限 |\n| `BOOKMARK_COOLDOWN` / `SEND_COOLDOWN` | `8` / `20` | 书签/发送间隔 |\n\n---\n\n## 错误处理\n- 失败分类与「异常 → 动作」完整表见 `references/safety_rules.md` 十（解析空/选择器漂移/撞墙/软限流/部分加载/网络/凭证未连接/日上限）。\n- 后端未就绪（`bz_status` 失败 / 缺 companion 扩展 / 解析失败）→ `exit 2`（runtime/companion 未就绪，不降级裸 CDP）。\n- 撞验证墙 → `exit 3`，停手交人工，冷却 ≥24h。\n- 发送/书签未授权 → `exit 4` 拒绝。\n- 单日改状态动作达 `DAILY_CAP` 上限 → `exit 5` 停手（R3）。\n- 岗位已关闭 / 下架（页面含「职位已关闭」但无 `.btn-startchat`）→ `exit 6`，跳过该岗（**非撞墙**，不冷却，请在岗位库标记「岗位关闭」）。\n- 发送后话术仍在输入框草稿态（未真正发出）→ `exit 7`（见 `process_job.sh` 严格送达判定）。\n- BOSS 登录态失效 → `exit 8`，请人工在 noVNC 重新登录（区别于撞墙：无需冷却）。**失败驱动、非主动预飞**：默认信任登录态，仅在「搜索 0 结果且登录页信号」或「发送未确认且登录页信号」时按需 `check_logged_in` 核验；命中即置 `logged_out` 并停手。登录态记录于 `<skill_root>/.state/login_state`（跨产品、机器级、不进 GitHub）。\n- 选择器漂移 → 回 `references/boss_selectors.md` 复核，**禁止绕过**（绕过=误触/误判）。\n\n---\n\n## 产物文件\n- `profile.yaml`：求职画像（输入契约）。\n- `target_library.csv`：目标岗位库（权威，去重主键=BOSS URL 的 `job_detail/<jid>`；辅助键=(公司名+岗位名+BOSS称呼)，防同公司同岗不同招聘方被误并）。\n- `.work/recruiter_jd.json` / `.work/eval.json` / `.work/chat_scan.json`：中间产物。\n- `破冰沟通YYYYMMDD.md`：话术文档（未授权时本地成稿）。\n\nFile v0.1.0:README.md\n\n# boss-zhipin-copilot\n\n[![Version](https://img.shields.io/github/v/tag/HuaGavin/boss-zhipin-copilot?label=version&color=blue&sort=semver)](CHANGELOG.md)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n[![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](requirements.txt)\n[![Dependencies](https://img.shields.io/badge/deps-pyyaml-lightgrey.svg)](requirements.txt)\n[![Agent](https://img.shields.io/badge/agent-WorkBuddy%20%7C%20OpenClaw%20%7C%20Claude%20Code%20%7C%20Codex-blueviolet.svg)](SKILL.md)\n[![Backend](https://img.shields.io/badge/browser%20backend-brs%20only%20(R12)-critical.svg)](https://github.com/energypantry/agent-browser-runtime)\n\n> 一个通用、可配置、开源的 **BOSS 直聘求职 copilot** skill。\n> 配合「仿真人浏览器后端」（[agent-browser-runtime](https://github.com/energypantry/agent-browser-runtime)，受控 Chromium + companion 真实光标）的真实光标浏览器，\n> 把「简历 + 求职目标」或「一句话目标」沉淀成可复用的能力：\n> **自动生成目标岗位画像与检索词 → 建立评分机制 → 建岗位库 → 在 BOSS 检索/收藏 → 读 JD 写破冰话术 → 按授权发送或仅本地成稿。**\n\n所有浏览器动作只经后端正门**真实光标**执行，强制限速、撞墙停手、授权门控，**绝不裸 CDP、绝不走浏览器扩展直控**。统一 **brs 单后端**（agent-browser-runtime 受控运行时，R12 反作弊红线）；设 `BZC_BACKEND=codex|cloak` 会被 `common.sh` 直接拒绝。\n适用于 WorkBuddy / OpenClaw / Codex / Claude Code 等任意 Agent 产品（Agent 产品指「谁来跑这个 skill」，与浏览器后端无关——BOSS 动作一律走 brs）。\n\n---\n\n## ✨ 特性\n\n- **输入极简**：给「简历/工作事实 + 一句目标」，或只给一个检索词 / 目标句即可启动。\n- **profile 驱动，零硬编码个人偏好**：检索词、硬排除类、评分门槛、破冰事实锚点全部来自 `profile.yaml`，\n  仓库**不预置任何平台的默认排除列表**（避免误杀别人的机会）。\n- **安全内建**：R1–R12 安全纪律全程兜底（真实光标、限速、撞墙冷却≥24h、授权门控、合并打开、预飞复制、单 lease、复核收敛、发送幂等 R10、登录态失败驱动 R11、反作弊单后端 R12）。\n- **完整闭环**：检索 → 过滤 → 书签入库 → 读 JD → 写破冰话术（自检 gate）→ 按授权发送 / 本地成稿。\n- **跨平台可移植**：Bash 负责 CLI 编排（封装 `brs.js`）+ Python 负责数据逻辑；`scripts/preflight_env.sh` 自动探测可用 Python（含受管解释器）并校验依赖，Python 一律经 `scripts/run_py.sh` 调用，无 `python3` 的环境也能直接跑（Windows 走 win-native 路径转换）。\n\n---\n\n## 🧱 架构\n\n三层：**谁来跑**（Agent 产品）→ **跑什么**（本 skill）→ **怎么点浏览器**（后端，唯一 `brs`）。\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│  Agent 产品层：谁来跑这个 skill                              │\n│  WorkBuddy / OpenClaw / Claude Code / Codex 等任意 Agent     │\n└───────────────────────────┬──────────────────────────────────┘\n                            │  读 SKILL.md，按工作流调用 scripts/\n┌───────────────────────────▼──────────────────────────────────┐\n│  boss-zhipin-copilot（本 skill = 应用层）                    │\n│  SKILL.md + scripts/(bash+python) + references/ + assets/    │\n│  只对 BrowserDriver 契约 bz_* 编程，不耦合具体浏览器实现     │\n└───────────────────────────┬──────────────────────────────────┘\n                            │  common.sh 探测并 source backends/brs.sh\n┌───────────────────────────▼──────────────────────────────────┐\n│  浏览器后端层：brs = agent-browser-runtime                   │\n│  受控 Chromium + companion：真实光标 / 持久登录 / 反检测     │\n│  唯一 sanctioned 后端：绝不裸 CDP、绝不扩展直控（R12）       │\n└───────────────────────────┬──────────────────────────────────┘\n                            │  真实光标事件（非 CDP 合成、非扩展直控）\n                            ▼\n                  ┌────────────────────┐\n                  │  zhipin.com（BOSS）│\n                  └────────────────────┘\n```\n\n- ⛔ **已废弃后端**：`codex`（Codex `@Chrome` 扩展直控）/ `cloak`（CloakBrowser）因 BOSS 反作弊风险移入 `scripts/backends/_deprecated/`，且 `common.sh` 对 `BZC_BACKEND=codex|cloak` **硬拒绝**（`exit 1`）——见 R12。\n- ⚠️ **别混淆两层**：Codex 作为 **Agent 产品**（第一层，跑这个 skill）完全可用；被禁的是它的 `@Chrome` **浏览器扩展直控**（第三层）。第一层用什么 Agent 随意，第三层只能是 `brs`。\n\n---\n\n## 📋 前置依赖\n\n> ⚠️ **本 skill 必须运行在「仿真人浏览器」之上**。没有它 → 脚本启动时 **fail-loud 并贴安装链接**，拒绝执行（直接裸 CDP / 合成点击会触发 BOSS 反作弊，曾导致封号）。\n\n1. **仿真人浏览器后端（仅 `brs`）**：\n   - **本地全自动（默认 `brs`）**：部署 [agent-browser-runtime](https://github.com/energypantry/agent-browser-runtime)（Docker 三容器 + 经 noVNC 登录 BOSS）。\n     `brs status` 须返回 `extensionConnected: true`。设 `BZC_BACKEND=brs`（默认，且为唯一 sanctioned 后端）。\n   - ⛔ **Codex `@Chrome` 托管 / CloakBrowser 已禁用**：BOSS 反作弊禁止任何 Agent 的浏览器扩展直控（R12），设 `BZC_BACKEND=codex|cloak` 会被 `common.sh` 直接拒绝。\n2. **Node.js** 与 **Python 3.10+**（在 `PATH` 上，或用 `NODE` / `PYTHON` 环境变量指定）。\n   脚本会自动按序探测 PATH、受管解释器、venv；**不要**自建 `runtime_env.sh` 之类外部垫片绕过这层。\n3. **pyyaml**：`pip install -r requirements.txt`（`preflight_env.sh` 会在启动时校验，缺失即 fail-loud）。\n4. **自检**：`bash scripts/preflight_env.sh` 一键确认 Python/依赖/路径转换就绪（`common.sh` 也会自动加载它）。\n\n---\n\n## 🚀 安装\n\n### 作为 Agent skill 安装（WorkBuddy / OpenClaw）\n\n```bash\n# 克隆（或下载 ZIP）\ngit clone https://github.com/HuaGavin/boss-zhipin-copilot.git boss-zhipin-copilot\n\n# WorkBuddy: 拷到项目级或用户级 skills 目录\ncp -r boss-zhipin-copilot ~/.workbuddy/skills/        # 用户级\n# 或  <项目根>/.workbuddy/skills/                          # 项目级\n\n# OpenClaw: 拷到 skills 目录\ncp -r boss-zhipin-copilot ~/.openclaw/skills/\n\n# 安装 Python 依赖\ncd boss-zhipin-copilot\npip install -r requirements.txt\n```\n\n> skill 是目录即生效，无需注册命令。下次会话 Agent 会自动加载。\n\n### 浏览器后端（仅 `brs`）\n\n```bash\n# 默认（本地全自动）：agent-browser-runtime\nexport BZC_BACKEND=brs\nexport BRS_JS=\"/绝对路径/agent-browser-runtime/cli/brs.js\"   # 或 AGENT_BROWSER_RUNTIME_HOME\n```\n\n> 🔴 **R12 反作弊红线**：BOSS 直聘禁止任何 Agent 的浏览器扩展直控（含 Codex `@Chrome` / CloakBrowser）。\n> 本 skill **统一 brs 单后端**；设 `BZC_BACKEND=codex|cloak` 会被 `common.sh` 直接拒绝（`exit 1` + 安装链接）。\n\n脚本会自动探测 `brs.js` 常见路径；未设置/缺失会被 **fail-loud** 并提示安装链接。\n后端契约与如何新增后端见 `references/browser_backend.md`（新增后端同样须是受控运行时，禁扩展直控）。\n\n---\n\n## 🎯 快速开始\n\n```bash\ncd boss-zhipin-copilot\n\n# 0) 生成求职画像（从一句目标 + 可选简历）\nbash scripts/run_py.sh build_profile.py \\\n  --goal \"我想找要求5年以上经验、月薪4万元以上的策略产品经理岗位（北京）\" \\\n  --resume 我的简历.md --out profile.yaml\n# → Agent 复核补全 hard_exclude / boost_keywords / fact_anchors\n\n# 1) 初始化岗位库\nbash scripts/setup_library.sh\n\n# 2) 在 BOSS 用真实 UI 搜索 profile.search.queries，收集结果卡片到 candidates.csv\n#    （真实光标走搜索框，禁止拼接搜索 URL 捷径；可加 --intent \"自然语言\" 自动映射筛选器）\nbash scripts/search_jobs.sh --profile profile.yaml --out .work/candidates.csv\n\n#    然后过滤 + 评分 + 入库：\nbash scripts/run_py.sh filter_library.py \\\n  --profile profile.yaml --input .work/candidates.csv \\\n  --library target_library.csv --out .work/eval.json\n\n# 3) 对每个通过项书签（真实光标）\nAUTHORIZED=1 bash scripts/process_job.sh --url <岗位URL> --bookmark\n\n# 4) 读 JD（备话术）\nbash scripts/process_job.sh --url <岗位URL> --read-jd --out .work/recruiter_jd.json\n\n# 5) 写破冰话术 + 自检 gate（详见 SKILL.md Step 4）\nbash scripts/run_py.sh audit_icebreaker.py .work/recruiter_jd.json 话术.md 事实库.md keys.json\n\n# 6) 用户授权后发送（或仅本地成稿）\nAUTHORIZED=1 bash scripts/process_job.sh --url <岗位URL> --send --msg 话术.txt\n```\n\n> 📝 上面命令里的 `话术.md` / `事实库.md` / `keys.json` / `话术.txt` 都由 Agent 在工作流中生成/补全，**运行前无需手动创建**：`事实库.md`（来自你的简历 + `profile.yaml`）、`话术.md`（audit_icebreaker 产出，你只审核）、`keys.json`（可选锚点，不提供照常跑）、`话术.txt`（本地发送正文）。\n\n完整工作流、纪律与脚本参数见 **[SKILL.md](SKILL.md)**。\n\n---\n\n## ⚙️ 核心配置：profile.yaml\n\n`profile.yaml` 是整个 skill 的唯一输入契约。结构（完整说明见 `references/profile_schema.md`）：\n\n```yaml\nmeta:                       # 可选：候选人标识（可空，不写也行）\n  candidate_name: \"你的名字\"\ngoal: \"我想找5年以上经验、月薪4万以上的策略产品经理岗位（北京）\"   # 原始目标句，存档回溯\nsearch:\n  city: \"北京\"\n  queries: [\"策略产品经理 北京\"]\nthresholds:\n  salary_floor: 40000      # 月薪下限（元），0=不限\n  seniority_years: 5       # 经验年限下限，0=不限\nhard_exclude:              # 命中任一即不入库（只列你确实无经验的类）\n  - category: \"广告/IAA\"\n    keywords: [\"IAA\", \"广告变现\", \"买量\"]\nboost_keywords: [\"增长\", \"留存\", \"C端\", \"0-1\", \"Agent\"]\nfact_anchors:              # 破冰事实锚点，必须真实可溯源\n  - anchor: \"用户增长\"\n    evidence: \"某内容平台渠道增长，次留提升 3%\"\n```\n\n仓库自带：\n- `assets/profile_template.yaml`：空模板，复制为 `profile.yaml` 填写。\n- `assets/example_profile.yaml`：**虚构示例**（候选人「李明」），演示 schema，非真实数据。\n- `assets/target_library_template.csv`：空库模板（表头）。\n\n---\n\n## 🔒 安全\n\n- 只走 `brs.js` 正门；真实光标；撞验证码/滑块立即停手冷却 ≥24h。\n- **限速**：动作间隔默认 5s±3s 抖动（书签 8s / 发送 20s），日上限 `DAILY_CAP=100` 硬计数，超限 `exit 5`；命中「操作频繁」自动指数退避（5→10→20→40，封顶 60s）。\n- **授权门控**：书签需批次授权；发消息需**每岗** `AUTHORIZED=1`，且发送幂等去重（R10）。未授权只浏览/读/本地成稿。\n- 详细纪律见 `references/safety_rules.md`（R1–R12）与 `references/cooldown_config.md`；变更历史见 [CHANGELOG.md](CHANGELOG.md)。\n\n---\n\n## 📁 目录结构\n\n```\nboss-zhipin-copilot/\n├── SKILL.md                      # 主入口：工作流 + 安全纪律\n├── README.md                     # 本文件\n├── CHANGELOG.md                  # 版本记录\n├── LICENSE                       # MIT\n├── requirements.txt              # pyyaml\n├── references/\n│   ├── profile_schema.md         # profile.yaml 字段定义\n│   ├── target_library_schema.md  # 岗位库 CSV schema\n│   ├── boss_selectors.md         # BOSS 选择器（需实况校验）\n│   ├── script_catalog.md         # 脚本复用目录：任务→内置脚本精确命令（复用铁律依据）\n│   ├── safety_rules.md           # R1–R12 安全纪律\n│   ├── cooldown_config.md        # 限速配置\n│   └── browser_backend.md        # 浏览器后端契约与兼容清单\n├── scripts/\n│   ├── common.sh                 # 后端探测 + source backends/$BZC_BACKEND.sh + fail-loud + 撞墙/冷却/限速\n│   ├── preflight_env.sh          # 环境预检层：解析可用 Python + 校验 pyyaml + 路径转换兜底\n│   ├── run_py.sh                 # 便携 Python 运行器（所有 .py 统一经它调用）\n│   ├── backends/\n│   │   ├── brs.sh                # 唯一后端：agent-browser-runtime（已实现，受控 Chromium + companion）\n│   │   └── _deprecated/          # ⛔ 已废弃：codex.sh(@Chrome) / cloak.sh —— 反作弊风险(R12)，勿用于 BOSS\n│   ├── setup_library.sh          # 初始化空库\n│   ├── search_jobs.sh            # 多词检索：复用同 tab 只读收集结果卡→candidates.csv\n│   ├── process_job.sh            # 单岗：书签/读JD/发消息（可复用 lease）\n│   ├── scan_chat.sh              # 扫描聊天列表（只读，不改状态）\n│   ├── zhipin-chat.extract.js    # 聊天列表提取器\n│   ├── parse_job.py              # 读JD的HTML DOM解析（process_job 内部调用）\n│   ├── parse_search.py           # 搜索结果卡片解析（search_jobs 内部调用）\n│   ├── build_profile.py          # 目标句→profile 草稿\n│   ├── filter_library.py         # 过滤+评分+入库\n│   ├── intent_filters.py         # 意图↔BOSS 编码唯一事实来源（search_jobs/process_job 内部调用）\n│   ├── strip_title.py            # 聊天消息首行「公司 姓名」标题行剥离（scan_chat 内部调用）\n│   └── audit_icebreaker.py       # 话术自检 gate\n└── assets/\n    ├── profile_template.yaml\n    ├── example_profile.yaml      # 虚构示例\n    └── target_library_template.csv\n```\n\n---\n\n## 🤝 贡献\n\n欢迎 PR。新增能力请保持：\n- 浏览器动作只经后端正门（BrowserDriver 契约），不引入裸 CDP / 合成点击 / 浏览器扩展直控。\n- 个人偏好走 `profile.yaml`，不在脚本硬编码。\n- 新增浏览器后端：在 `scripts/backends/` 实现 `bz_*` 契约并在 `references/browser_backend.md` 补一行（见该文件「如何新增后端」）。\n  **约束（R12）**：新后端必须是**受控运行时**（真实光标事件），任何基于浏览器扩展直控的方案不接受用于 BOSS。\n- 新增 Python 脚本经 `scripts/run_py.sh` 调用，不直接写 `python3 xxx.py`（受管环境无 `python3`）。\n- 新增脚本遵循 OpenClaw 约定（描述性命名、动词前缀、环境变量而非硬编码路径、幂等），并登记到 `references/script_catalog.md`。\n\n---\n\n## 📄 License\n\n[MIT](LICENSE)\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn727b0hk04906tj8vp8kzrb3x8763rk\",\n  \"slug\": \"boss-zhipin-copilot\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1786283844485\n}\n\nFile v0.1.0:references/boss_selectors.md\n\n# BOSS 直聘选择器 / 页面 / 点位（需实况校验）\n\n> 本文件是「选择器 / 页面 / 点位」三类资产的唯一权威索引，遵循 SKILL.md「🛑 优先复用与增量更新」原则：\n> **复用优先**（已有条目直接用）、**发现错误就地改**（漂移 → 回本文件更新，**禁止绕过**）、**发现新内容补进对应节**（标「首次校验」）。\n> 选择器来自社区实战提取，**BOSS 前端会改版，可能漂移**；每次大版本先预飞 1 岗确认字段非空再批量。\n\n---\n\n## 一、招聘方 / JD / 公司（读详情用，较稳）\n\n| 用途 | 选择器 | 提取要点 |\n|---|---|---|\n| 招聘方姓名 | `.job-boss-info .name` | 取首行文本，去「在线」二字 |\n| 招聘方职位 | `.boss-info-attr` | 取「·」分隔末段 |\n| 完整 JD | `.job-sec-text` | 回退 `.job-detail-section` / `.text-desc` |\n| 公司 | `.sider-company` | 公司名 + 规模 + 阶段 |\n| ⚠️ 登录账号本人 | `.user-nav` | **严禁**当作招聘方（那是登录用户本人） |\n\n---\n\n## 二、书签按钮（较稳）\n\n| 用途 | 选择器 | 核验 |\n|---|---|---|\n| 感兴趣 | `.btn-interest` | 点击后文本应变「取消感兴趣」；以此核验成功 |\n\n---\n\n## 三、沟通 / 发送（✅ 2026-07-23 实战校准；UI 有两个变体，按序 fallback）\n\n| 用途 | 首选（2026-07-23 实测） | 回退（2026-07-20 变体） | 备注 |\n|---|---|---|---|\n| 立即沟通 | `.btn-startchat` | — | 详情页按钮；点击后进入聊天弹窗（可能自动聚焦输入框） |\n| 输入框 | `#chat-input`（contenteditable div，class=`.chat-input`） | `textarea.input-area` | 两变体并存，先试 `#chat-input` |\n| 发送 | `.btn-send`（`button.btn-v2.btn-sure-v2.btn-send`） | `.send-message` | 先试 `.btn-send` |\n\n- **送达校验（严格）**：发送后重新取 HTML，要求 ①`#chat-input` 编辑框已清空（草稿不残留）②消息区含话术前缀；出现 `status-delivery`（`[送达]`）为最强确认。**仅 grep 页面含话术会误判**——键入未发送时草稿也在页面里。\n- 「职位已关闭」页面无 `.btn-startchat` → 跳过该岗并记库（exit 6），**不算撞墙**，继续批次。\n\n---\n\n## 四、会话列表（✅ 2026-07-23 实测校准）\n\n| 用途 | 选择器（实测） | 备注 |\n|---|---|---|\n| 会话条目 | `.chat-item` / `.friend-content` | 含 (name, company, role) 用于去重 |\n| 滚动容器 | `.user-list` | 真实滚动容器（非外层面板）；提取器已用 `ui.move` 定位 |\n| 最近消息预览 | `.last-msg-text` | 核对我方已发话术是否落盘 |\n| 送达标记 | `status-delivery`（`message-status` 类，文案 `[送达]`） | **最强送达确认**；独立复核聊天列表时逐条确认 [送达] |\n\n- 送达校验双保险：发送后除「编辑框清空 + 消息区含话术」（见三），再到 `/web/geek/chat` 列表核对 `status-delivery` 标记，逐条确认 [送达]（2026-07-23 已用此法独立复核 5 岗）。\n\n---\n\n## 五、搜索框 + 结果卡片（Step 2 检索，search_jobs.sh / parse_search.py）\n\n| 用途 | 选择器 | 备注 |\n|---|---|---|\n| 岗位搜索页 | `https://www.zhipin.com/web/geek/job` | 复用同 tab 导航到此再检索 |\n| 搜索输入 | `.search-input-box .input` | 真实光标点击 → `ui type` 查询词 |\n| 搜索按钮 | `.search-btn` | 提交检索 |\n| 岗位名 + 链接 | `a.job-name`（`href`） | href 形如 `/job_detail/XXX.html` |\n| 公司名 | `.boss-name` | |\n| 城市 | `.company-location` | 如「北京·朝阳区」 |\n| 经验/学历 | `.tag-list li` | 限定卡内，防跨卡串扰 |\n| 薪资 | `.job-salary` | ⚠️ 字体反爬混淆，**禁读**，须从 JD 详情页取 |\n\n> skill 强制**真实 UI 搜索**（键入 + 点搜索），禁止拼接 `?query=&city=&page=` 捷径 URL。\n\n### 结果页筛选器（✅ 2026-07-23 实测校准；hover 出下拉、复选、URL 侧证生效）\n\n搜索提交后结果页 URL 变为 `/web/geek/jobs`，**搜索框正下方**一排筛选触发器（实测 y≈140）。下拉显隐是**纯 CSS `:hover`**（选项 `li` 常驻 DOM，无 open/active 状态类）→ **读选项无需 hover，但真实光标点选前必须先 `ui move` 悬停到触发器让下拉可见**。\n\n| 结构 | 选择器 | 备注 |\n|---|---|---|\n| 筛选器容器 | `.condition-filter-select`（常规）/ `.condition-industry-select`（公司行业）/ `.condition-position-select`（职位类型） | 每个筛选一个容器 |\n| 触发器（hover 点位） | 容器内 `.current-select` | ⚠️ **禁用 `--targetText \"公司规模\"` 定位**——实测命中页面中部其它文本（y=428 非筛选栏 y=142）致 `UI target not found`；须用结构选择器，如 `.condition-filter-select:has(li[ka=\"sel-job-rec-scale-0\"]) .current-select` |\n| 下拉面板 | `.filter-select-dropdown` → `ul.select-list` → `li[ka=...]` | `li` 的 `ka` 属性 = 唯一稳定点位 |\n\n**全部筛选器与 `ka` 编码**（`ka=\"sel-job-rec-<域>-<code>\"`；`0`=不限）：\n\n| 筛选器 | 域 | 选项编码 | 复选 |\n|---|---|---|---|\n| 职位类型 | `sel-position-*` | 二级面板（互联网/AI、产品…） | — |\n| 求职类型 | `jobType` | 1901全职 / 1903兼职 | 单选 |\n| 薪资待遇 | `salary` | 402 3K以下 / 403 3-5K / 404 5-10K / 405 10-20K / 406 20-50K / 407 50K以上 | 单选 |\n| 工作经验 | `exp` | 108在校生 / 102应届生 / 101经验不限 / 103 1年内 / 104 1-3年 / 105 3-5年 / 106 5-10年 / 107 10年以上 | 复选 |\n| 学历要求 | `degree` | 209初中及以下 / 208中专中技 / 206高中 / 202大专 / 203本科 / 204硕士 / 205博士 | 复选 |\n| 公司行业 | （二级面板） | 大类行 `li.clearfix` 内嵌子项，无单值 ka；首次点选前须再实测 | — |\n| **公司规模** | `scale` | **301 0-20人 / 302 20-99人 / 303 100-499人 / 304 500-999人 / 305 1000-9999人 / 306 10000人以上** | **复选** |\n| 融资阶段 | `stage` | 801未融资 / 802天使轮 / 803A轮 / 804B轮 / 805C轮 / 806 D轮及以上 / 807已上市 / 808不需要融资 | 复选 |\n\n**实测操作配方（全程真实光标；6 维度通用）**：\n- **通用触发器选择器**（每维复用，把 `<dim>` 换成 scale/stage/exp/degree/salary/jobType）：\n  `ui move --selector '.condition-filter-select:has(li[ka=\"sel-job-rec-<dim>-0\"]) .current-select'` → 悬停展开\n  `ui click --selector 'li[ka=\"sel-job-rec-<dim>-<code>\"]'` → 点目标档\n- **每点一档后须重新 hover 一次**再点下一档（点选后下拉可能收起；复选维需逐档重复）。\n- **生效核验**：tab URL 出现对应参数（复选=逗号分隔），结果自动刷新。实测 6 维点选后 URL：\n  `.../jobs?city=...&jobType=1901&salary=406&experience=105&degree=203&scale=303&stage=804&query=...`\n  即 URL 参数名映射：**scale→scale / stage→stage / exp→experience / degree→degree / salary→salary / jobType→jobType**（注意 exp 在 URL 里叫 `experience`，但 `ka` 域仍是 `exp`）。\n- ⚠️ URL 参数**仅作生效核验，禁止直接拼 URL 导航**（R1 禁查询串捷径）；应用一律走真实光标 hover+click。\n\n**6 维度选值速查（与上方编码表一致；`0`=不限永不点选）**：\n\n| 维度 | 选值方式 | 常用编码 |\n|---|---|---|\n| 公司规模 scale | 复选 | 302 20-99人 / 303 100-499人 / 304 500-999人 |\n| 融资阶段 stage | 复选 | 802 天使 / 803 A / 804 B / 805 C / 806 D轮及以上 / 807 已上市 / 808 不需要融资 |\n| 工作经验 exp | 复选 | 102 应届 / 104 1-3年 / 105 3-5年 / 106 5-10年 / 107 10年以上 / 108 在校 |\n| 学历要求 degree | 复选 | 202 大专 / 203 本科 / 204 硕士 / 205 博士 |\n| 薪资待遇 salary | **单选** | 405 10-20K / 406 20-50K / 407 50K以上 |\n| 求职类型 jobType | **单选** | 1901 全职 / 1903 兼职 |\n\n- 筛选是本地搜索视图状态，不改账号状态（非收藏/沟通），属只读安全动作；换查询词重新搜索后筛选**是否保留未实测**，稳妥做法=每词搜索后重新应用（`search_jobs.sh` 已落实）。\n- `search_jobs.sh` 现已内置**全 6 维度**筛选：`--intent \"自由文本\"`（自动解析意图）、或 `--scale/--stage/--exp/--degree/--salary/--jobtype` 逐维覆盖；未显式给的维度从 profile `thresholds` 推导（见 `intent_filters.py` 与 `script_catalog`）。\n\n---\n\n## 六、个人中心 / 已知页面（导航目标，防盲试）\n\n| 页面 | URL | 进入方式 | 用途 |\n|---|---|---|---|\n| 个人中心 | `https://www.zhipin.com/web/geek/recommend` | 点击主页右上角**头像**进入 | 聚合查看本人所有状态 |\n| 收藏列表（感兴趣） | 同上 URL 的「感兴趣」tab | 个人中心顶部第 4 个 tab | **只读**查看全部已收藏岗位 |\n| 岗位详情页 | `https://www.zhipin.com/job_detail/<jid>.html` | 搜索卡 `a.job-name` 的 href 取 `<jid>` | 读 JD / 发消息起点 |\n\n- ⚠️ **导航到 JD 详情页须去掉 `?securityId=...`**：带完整 securityId 的 URL 会变回通用页、JD 标记缺失（2026-07-23 实测踩坑）。只用 `https://www.zhipin.com/job_detail/<jid>.html` 即可。\n\n- **术语映射**：BOSS 把\"收藏\"叫「感兴趣」。本 skill 的「已收藏(感兴趣)」状态、详情页 `.btn-interest` 按钮、此列表页——三者同义。\n- **个人中心顶部 4 tab（从左到右）**：`沟通过` / `已投递` / `面试` / `感兴趣`。「感兴趣」= 岗位收藏列表。\n- **只读用途**：核对 `target_library.csv` 的「已收藏(感兴趣)」是否与 BOSS 实际一致；**绝不在此页做改状态动作**（点错会触发取消收藏 / 重新沟通）。\n- **「感兴趣」开关本体在详情页**：`.btn-interest`（见第二节），不在本列表页；列表页是聚合视图，但**每卡另有 `a.btn-startchat` 可发起沟通**（结构见上方「收藏列表卡片 DOM」）。\n- ⚠️ URL 与 tab 文案可能随 BOSS 改版漂移；首次用先人工确认 tab 位置，勿硬编码路径盲跳。\n\n### 收藏列表卡片 DOM（2026-07-23 实测；可从此页逐卡发起沟通）\n\n| 用途 | 选择器 | 备注 |\n|---|---|---|\n| 卡片容器 | `ul.user-jobs-ul` → `li.item-boss` | 每个收藏岗一张卡（2026-07-23 实测解析确认） |\n| 岗位名 | `.job-name-text` | |\n| 城市/区域 | `.location` | 如「北京·海淀区·苏州桥」 |\n| 薪资·经验·学历 | `.job-info p.gray` | 三段灰字；**薪资字体反爬禁读**，须进 JD 详情页取 |\n| 招聘方 | `.info-header h3.name span` | 去「招聘者/HR/创始人」后缀；**容器不同于** JD 详情页的 `.job-boss-info .name` |\n| 公司 | `.company-info b > a` | |\n| 行业·阶段·规模 | `.company-info p.gray > span` | |\n| 立即沟通（列表内） | `a.btn-startchat`（ka=`personal_interest_chat_xxx`） | 解析确认存在；点击预期同 JD 详情页 `.btn-startchat`（开聊），**本会话未实测点击，首次用先预飞 1 卡**；与 `.btn-interest`（感兴趣开关，见二）是不同按钮 |\n\n- ⚠️ 列表页**每卡都有** `a.btn-startchat`，可不经详情页直接发消息；但严谨流程仍先 `--read-jd` 读 JD 再发（话术需 JD 洞察）。\n- 滚动容器待核：实测一次性渲染 ~15 张卡（tab 计数 27，可能因虚拟滚动或含「公司收藏」子 tab 不全）；补全卡量时用 `ui.scroll` 加载更多，容器疑似 `.user-jobs-ul`（首次用先人工确认）。\n- 解析/批量处理须用真实光标 + DOM 提取（无内置 `zhipin-bookmark.extract.js`，当前为临时 Python 解析 HTML）。\n\n---\n\n## 七、验证墙\n\n- URL 含 `verify.html` 或页面文本含「验证码」「安全验证」「请完成」→\n  **立即停手交人工，冷却 ≥24h**（见 `safety_rules.md` R4）。\n\nFile v0.1.0:references/browser_backend.md\n\n# 浏览器后端（BrowserDriver）契约与兼容清单\n\n本 skill 的所有「浏览器动作」都通过一套 **BrowserDriver 契约** 执行，而不是直接调用某个具体工具。\n这样用户可以用自己已有的「仿真人浏览器」——只要它实现了下面的函数，就能即插即用。\n\n代码入口：`scripts/common.sh` 读取环境变量 `BZC_BACKEND`（默认 `brs`），\n`source scripts/backends/$BZC_BACKEND.sh`，随后所有脚本只调用下面定义的 `bz_*` 函数。\n\n---\n\n## 一、契约：每个后端必须实现的函数\n\n> 约定：所有 `bz_*` 函数由 `backends/<name>.sh` 定义；`common.sh` 在 source 后调用它们。\n> 任何「未就绪 / 撞验证墙 / 未授权」都必须 **fail-loud（非零退出 + 明确 stderr 信息）**。\n\n| 函数 | 入参 | 行为 | 必须 |\n|------|------|------|------|\n| `bz_mode` | 无 | 打印 `local` 或 `hosted` 到 stdout。`hosted`=浏览器由外部 Agent（如 Codex）托管，本 skill 只生成步骤提示词，不实际驱动 | ✅ |\n| `bz_status` | 无 | 运行时就绪闸门。不就绪则 fail-loud（exit≠0）。`hosted` 模式可只打印提示并正常退出 | ✅ |\n| `bz_browse_start` | `<url> [humanize]` | 打开目标页、占用一个租约/标签页；**导出全局变量 `BZ_LEASE` / `BZ_TAB`**（调用方不再解析 stdout）；同时把原始 JSON 打到 stdout | ✅ |\n| `bz_browse_html` | `<lease> <tab>` | 打印当前页 HTML 到 stdout（用于解析 JD / 招聘方 / 撞墙检查） | ✅ |\n| `bz_browse_nav` | `<lease> <tab> <url>` | 复用同一 lease/tab 导航到新 URL（不重开 tab，落实「禁频繁开关」；检索多词复用） | ✅ |\n| `bz_browse_end` | `<lease>` | 释放租约/关闭标签页 | ✅ |\n| `bz_ui` | `<tab> <subcommand...>` | 真实光标 UI 原语：`wait-for --selector` / `click --selector` / `type --text` / `scroll` / `move`。**必须用真实光标，禁止合成点击** | ✅ |\n| `bz_extract` | `<jsfile> <lease> <tab> <params-json>` | 运行页面内提取器（聊天列表扫描等），结果打印到 stdout | 条件（scan_chat 需要） |\n| `bz_emit_plan` | `<原始 argv...>` | 仅 `hosted` 模式需要：把一次浏览器任务翻译成可粘贴到外部 Agent 的步骤提示词 | 条件（hosted 需要） |\n\n通用助手（由 `common.sh` 提供，后端可调用）：\n- `verify_wall <html>`：命中验证墙关键词即 fail-loud（exit 3）。\n- `cooldown <secs>`：限速 sleep（含 ±`COOLDOWN_JITTER` 抖动）。\n- `rate_backoff`：软限流指数退避（间隔按 2^(n-1) 拉长，封顶 `BACKOFF_MAX`），命中「操作频繁」时调用。\n- `bz_wait <lease> <tab> <token> [timeout] [interval]`：轮询当前页直到 `token` 元素出现（就绪闸门），超时 fail-loud；hosted 直接 return 0。\n- `backend_is_hosted`：返回 0 当且仅当 `bz_mode` 为 `hosted`。\n\n**安全纪律（R1–R12，见 safety_rules.md）对一切后端生效**：真实光标、限速、撞墙停手≥24h、授权门控、合并打开复用 lease、预飞复制、单 lease。后端只是「手部」，纪律不变。\n\n---\n\n## 二、已知后端清单与支持矩阵\n\n| 后端 | `BZC_BACKEND` | 模式 | 开源/免费 | 反检测路线 | 本仓库状态 | 安装/文档 |\n|------|---------------|------|-----------|-----------|-----------|-----------|\n| **agent-browser-runtime** | `brs` | local | 开源 MIT | 真实 Chromium + companion 扩展 + broker 租约 + 人性化限速（**唯一 sanctioned 后端，最贴合 BOSS 直聘**） | ✅ **已实现且默认** | https://github.com/energypantry/agent-browser-runtime |\n| **OpenAI Codex** | `codex` | hosted | 需 ChatGPT Plus/Pro + Codex 桌面端 | 真实登录态 Chrome + 官方扩展 + Computer Use 光标 | ⛔ **已废弃（反作弊风险，勿用于 BOSS）**：移入 `backends/_deprecated/`，`common.sh` 拒绝加载 | https://developers.openai.com/codex/app/chrome-extension |\n| **CloakBrowser** | `cloak` | local | 开源 MIT | 源码级改指纹隐身 Chromium + `humanize=True` | ⛔ **已废弃（反作弊风险，勿用于 BOSS）**：移入 `backends/_deprecated/`，`common.sh` 拒绝加载 | https://github.com/CloakHQ/cloakbrowser |\n| **agent-browser (Vercel)** | `agent_browser` | local | 开源 | 无障碍树 `@eX` 引用交互（轻量，非反检测路线） | ⚪ 文档候选（未实现；若实现须是受控运行时，禁扩展直驱） | https://github.com/vercel-labs/agent-browser |\n\n> 🔴 **R12 反作弊红线（硬性）**：BOSS 直聘禁止**任何 Agent** 的浏览器扩展直控（含 Codex `@Chrome` / CloakBrowser）。\n> 本 skill **统一 `brs` 单后端**（agent-browser-runtime 受控运行时）；设 `BZC_BACKEND=codex|cloak` 会被 `common.sh` 直接拒绝（`exit 1` + 安装链接）。\n> `codex.sh`/`cloak.sh` 已移入 `backends/_deprecated/` 并加 ⛔ 头，仅供**其他站点**参考 `bz_*` 抽象，绝不用于 BOSS。\n\n> 选型建议：**只用 `brs`**（本地全自动，Docker + 受控 Chromium + companion 真实光标）。\n\n---\n\n## 三、如何新增一个后端\n\n1. 在 `scripts/backends/` 新建 `<name>.sh`，实现第一节的全部「必须」函数（hosted 再加 `bz_emit_plan`）。\n2. 保持安全纪律：真实光标、限速、撞墙停手、授权门控。如后端不支持某原语，fail-loud 说明，不要降级成合成点击。\n3. 在 README 的支持矩阵和本文件补一行。\n4. 本地模式后端需保证 `bz_status` 能真正探测「扩展/光标已就绪」，否则宁可 fail-loud 也不要盲跑。\n\n---\n\n## 四、缺失/未知后端：fail-loud 示例\n\n```\nFAIL_LOUD: 未检测到可用的「仿真人浏览器」后端。\n  本 skill 必须运行在仿真人浏览器之上（直接裸 CDP / 合成点击 / 扩展直驱会触发 BOSS 反作弊，已多次导致封号）。\n  请安装 agent-browser-runtime 并设 BZC_BACKEND=brs（唯一 sanctioned 后端）：\n    https://github.com/energypantry/agent-browser-runtime\n  退出码 1。\n```\n\nFile v0.1.0:references/cooldown_config.md\n\n# BOSS 限速配置（zhipin）\n\n> **关键事实**：agent-browser-runtime 的 `platformCooldownSeconds()` 默认只覆盖\n> `reddit / facebook / linkedin / instagram / manualChallenge`，**不含 zhipin**；对未知平台返回 `generic: 0`。\n> 因此 BOSS 的限速**必须由本 skill 脚本显式实现**（脚本内 `sleep` + 日计数）。\n> 项目一层保护都不给——这是安全底线，不可依赖运行时。\n\n---\n\n## 一、极简限速（安全底线，不可突破）\n\n| 项 | 默认值 | 环境变量 | 说明 |\n|---|---|---|---|\n| 动作间隔 | 5s | `ACTION_INTERVAL_SECONDS` | 每次浏览器动作前 `sleep` |\n| 日上限 | 100 | `DAILY_CAP` | 每日收藏 + 开聊总数硬上限；脚本内部计数，超限即停 |\n| 撞墙冷却 | ≥24h | （不可覆盖） | 撞验证墙立即停手，期间仅真人使用 |\n\n- 现已纯 UI 真实光标点击，基本无超时风险；以上为**不可突破的底线**。\n\n---\n\n## 二、验证墙冷却（最高优先级）\n\n一旦撞 `verify.html` / 「验证码」：\n\n1. 立即停手，截图留存。\n2. 交人工（用户）通过验证码。\n3. **冷却 ≥24h，期间仅真人正常使用，绝不恢复自动化**。\n4. 脚本已内置 `FAIL_LOUD`：撞墙即 `exit 3`，不重试、不绕过。\n\n---\n\n## 三、环境变量覆盖\n\n脚本读取以下环境变量（均有保守默认值）：\n\n```bash\nexport ACTION_INTERVAL_SECONDS=5     # 动作间最小间隔秒数\nexport DAILY_CAP=100                 # 每日收藏 + 开聊总数硬上限\nexport BOOKMARK_COOLDOWN=8           # 书签动作间隔（覆盖 ACTION_INTERVAL_SECONDS）\nexport SEND_COOLDOWN=20              # 发送动作间隔（覆盖 ACTION_INTERVAL_SECONDS）\nexport WORK_DIR=\"./.work\"            # 中间产物落盘目录\n```\n\n> 节奏宁可慢不可快。账号安全 > 效率。任何「提速」需求都先过 R3/R4 复核。\n\n---\n\n## 四、人体化节奏（防机器特征 · Item5）\n\n固定节奏易被反作弊识别为脚本。两项细化：\n\n- **抖动（jitter）**：`cooldown()` 在基础间隔上叠加 ±`COOLDOWN_JITTER` 随机秒，更接近真人操作。默认 `COOLDOWN_JITTER=3`（即 5s±3 → 2–8s）。\n- **软限流退避（rate_backoff）**：一旦页面提示「操作频繁」或接近日上限，调用 `rate_backoff` 让间隔按 `2^(n-1)` 指数拉长（5→10→20→40→60 封顶），`BACKOFF_MAX` 控制上限。命中即退避、不再机械连点。\n\n| 变量 | 默认 | 说明 |\n|---|---|---|\n| `COOLDOWN_JITTER` | `3` | 间隔随机抖动幅度（±秒）；设 0 退化为固定间隔 |\n| `BACKOFF_MAX` | `60` | 软限流指数退避上限（秒） |\n\n> 用法：正常动作走 `cooldown`；命中软限流信号时改调 `rate_backoff`（间隔自动递增）。会话内退避计数器持续累计，新会话自动清零。\n\nFile v0.1.0:references/profile_schema.md\n\n# 求职目标画像 Profile（profile.yaml）Schema\n\n> 本文件定义 `boss-zhipin-copilot` 的**唯一输入契约**。\n> 整个 skill（检索词、硬排除、评分门槛、破冰事实锚点）全部由本文件驱动，**零硬编码个人偏好**。\n> 真实权威文件：用户提供的 `profile.yaml`（默认读取 `./profile.yaml` 或 `$PROFILE` 指向的文件）。\n\n---\n\n## 一、Profile 怎么来\n\n两种入口，skill 都支持：\n\n- **入口 A（推荐，最完整）**：用户提供 **简历/工作事实文件** + **一句话求职目标**。\n  Agent 读取后用 `scripts/build_profile.py` 抽出草稿，再校验补全，产出 `profile.yaml`。\n- **入口 B（最简）**：用户只给 **一个检索词**（如「产品经理」）或 **一句话目标**\n  （如「我想找要求 5 年以上经验、月薪 4 万以上的策略产品经理岗位」）。\n  Agent 从句子里尽量解析 `city / salary_floor / seniority_years / 目标角色`，\n  解析不出的项保守留空（=不限），必要时向用户追问 1 个最关键的问题（城市？薪资下限？）。\n\n> 无论哪条入口，**profile 必须由 Agent 显式生成并经用户确认**，不得凭空假设。\n\n---\n\n## 二、字段定义\n\n```yaml\nmeta:\n  candidate_name: \"李明\"        # 仅用于破冰话术称呼，可空\n  generated_at: \"2026-07-19\"    # 生成日期，便于回溯\n  notes: \"\"                     # 自由备注\n\n# 原始目标句（保留以便回溯意图）\ngoal: \"我想找要求 5 年以上经验、月薪 4 万以上的策略产品经理岗位（北京）\"\n\nsearch:\n  city: \"北京\"                  # 检索/筛选期望城市；空字符串=不限\n  queries:                      # 实际在 BOSS 搜索框输入的查询词列表\n    - \"策略产品经理 北京\"\n    - \"产品经理 策略 北京\"\n    - \"高级产品经理 北京\"\n\nthresholds:                     # 评分门槛：全部满足才「可收藏」\n  city: \"北京\"                  # 期望城市；空=不限\n  salary_floor: 40000           # 月薪下限（元）；0 或空=不限\n  seniority_years: 5            # 经验年限下限；0 或空=不限\n  stage_allow: []               # 公司阶段白名单，如 [\"成长期\",\"不需要融资\",\"未融资\"]；空=不限\n  scale_max: 0                  # 公司规模上限（人）；0 或空=不限\n  employment_type: \"\"           # 全职/兼职/实习；空=不限\n\nhard_exclude:                   # 硬排除：命中任一关键词即「不入库不收藏」\n  - category: \"广告/IAA\"\n    keywords: [\"IAA\", \"广告变现\", \"买量\", \"穿山甲\", \"AdMob\"]\n  - category: \"金融资质\"\n    keywords: [\"证券\", \"基金从业\", \"财富管理\", \"交易系统\"]\n\nboost_keywords:                 # 加分关键词：JD 命中越多评分越高（用于排序，非否决）\n  - \"增长\"\n  - \"留存\"\n  - \"付费转化\"\n  - \"C端\"\n  - \"0-1\"\n  - \"Agent\"\n  - \"会员\"\n\nfact_anchors:                   # 事实锚点：破冰话术匹配源 + 自检 gate 的事实字典\n  - anchor: \"用户增长\"\n    evidence: \"某内容平台渠道增长，次留提升 3%，线索成本降 50%\"\n  - anchor: \"0-1 产品\"\n    evidence: \"主导某工具产品从 0 到 1 独立上线\"\n```\n\n---\n\n## 三、字段规则\n\n| 字段 | 类型 | 说明 / 默认值 |\n|---|---|---|\n| `meta.candidate_name` | str | 仅话术称呼用；可空 |\n| `goal` | str | 原始目标句，存档回溯 |\n| `search.city` | str | 城市过滤；空=不限 |\n| `search.queries` | list[str] | BOSS 搜索框实际输入词；至少 1 个 |\n| `thresholds.*` | 见上 | 任一为空/0 = 该维度不限 |\n| `hard_exclude[].category` | str | 排除类目名（仅给人看） |\n| `hard_exclude[].keywords` | list[str] | 命中任一即否决；**用户按自身背景增减** |\n| `boost_keywords` | list[str] | 评分加分项，越多越好 |\n| `fact_anchors[].anchor` | str | 能力/经历主题 |\n| `fact_anchors[].evidence` | str | 可溯源证据（公司+动作+数字），**严禁编造** |\n\n---\n\n## 四、生成纪律（Agent 必须遵守）\n\n1. **硬排除来自用户背景，不是通用规则**：只有「用户明确无对应经验/资质」的类别才列入。\n   不要预置任何平台的默认排除列表——那会误杀别人的机会。\n2. **门槛保守**：解析不出的维度留空（=不限），宁漏勿错杀；不要替用户拍板薪资/城市。\n3. **fact_anchors 必须真实可溯源**：每条 evidence 都能在用户简历/事实文件里找到依据；\n   AI/AIGC 类经历只锚定具体场景，不暗示生产级大模型自研。\n4. **profile 是本地文件**：生成后落地 `profile.yaml`，后续脚本全部读它，不二次询问。\n\nFile v0.1.0:references/safety_rules.md\n\n# BOSS 直聘安全操作纪律（R1–R12，泛化版）\n\n> 本文件是 `boss-zhipin-copilot` 的**灵魂**。所有浏览器动作必须服从本纪律。\n> 源于一次真实封号事故的第一性原理复盘：绕过运行时直连、无冷却、批量突发、撞墙后恢复自动化 = 封号。\n> 适用于任何 Agent 产品（WorkBuddy / OpenClaw / Codex / Claude Code 等）。\n\n---\n\n## R1 只走 agent-browser-runtime 正门\n\n- 所有浏览器动作只经 `./cli/brs.js`（或 `$BRS_JS`）→ broker(:17890) → companion extension → Chrome。\n- **绝不**直连 CDP(:19223)、绝不 `Runtime.evaluate` 合成点击、绝不 `Input.dispatchMouseEvent`、\n  绝不 `Page.navigate` 到 `?query=&city=&page=` 合成 URL。\n- 初始 `browse-start` 允许用真实 entry URL（用户给的岗位链接 / BOSS 首页），之后的检索/翻页/筛选**必须走真实 UI**。\n\n## R2 只真实光标\n\n- 点击/键入只用 extension 的 `ui.click` / `ui.type`（真实光标移动+点击）。\n- 禁止任何 `el.click()` 合成点击、`location` 跳转、dispatch DOM 事件。\n\n## R3 限速强制\n\n- 操作间间隔 ≥ `$ACTION_INTERVAL_SECONDS`（默认 5s），由 `common.sh` 的 `cooldown` 实现。\n- 每日收藏 + 开聊总数 ≤ `$DAILY_CAP`（默认 100）。\n- 无限速 = 不执行。**已落地实现**：`common.sh` 的 `bump_daily_cap` 在每个改状态动作\n  （`process_job.sh` 的书签 / 发送）执行前跨调用持久化计数（落盘\n  `${WORK_DIR:-.work}/.daily_action_count_YYYYMMDD`，按自然日隔离），超 `DAILY_CAP` 即 `exit 5` 停手。\n- ⚠️ **hosted 边界（F11，仅适用于非 BOSS 站点）**：此模式浏览器由外部 Agent（如 Codex）端驱动，**本地代码层无法计数 / 强制日限额**，R3 限速仅以 `bz_emit_plan` 提示词「单日勿超 100」**文本提醒，无代码兜底**。**执行方须自律**，切勿误以为「已限速」而批量突发。⚠️ BOSS 直聘已 **R12 禁用任何扩展直控（含 codex hosted）**，请勿走此路径。\n\n## R4 撞墙即停\n\n- 遇验证码 / `verify.html` / 「安全验证」/ 滑块 → **立即停手、截图、交人工**。\n- 冷却 **≥24h**，期间仅真人使用，**绝不**恢复自动化。\n- 脚本 `exit 3`（撞墙码），不重试、不绕过。\n\n## R5 授权门控\n\n- 「改账号状态」动作（书签、发消息、投递）需用户**显式授权**：\n  - 书签：用户授权「这批 / 全部」批次。\n  - 发消息：**每岗**显式授权（`AUTHORIZED=1`）。\n- 未授权只做浏览 / 截图 / 读元素 / 填表。\n\n## R6 合并打开、避免无谓重开\n\n- 同一任务内，能在一次详情页打开完成的动作合并到同次（书签 + 读JD + 授权则发消息）。\n- 不按动作类型拆批重开同岗。具体同次哪些动作由当次任务决定。\n\n## R7 预飞后复制\n\n- 先用 **1 个岗位**端到端跑通整条路径（含选择器校验），确认无误后，\n  其余岗位走**同一代码路径**复用。禁止先批量跑全部再修 bug。\n\n## R8 单 lease 连续 tab\n\n- 批量任务用一次 `browse-start` 拿一个 Tab Group，全程复用（用 `browse-nav` 切岗），\n  禁止多进程反复杀重启（burst）。\n- `process_job.sh` 支持传入 `--lease/--tab` 复用；省略则自管（简单场景）。\n\n## R9 复核收敛\n\n- 每步仅 1 个权威完成产物（如 `candidates.csv` / CSV 行数）。\n- 产物出现后最多 1 次交叉校验，不反复轮询 / 反复 inspect。\n\n---\n\n## R10 发送幂等 / 防重复（断点续发安全）\n\n- **任何「批量逐岗发送」编排（含 SKILL.md Step 5 官方循环）都必须有 done 状态追踪 + 幂等保证**：否则中断后重跑会重复发，属反作弊高风险 + 骚扰招聘方。\n- **已发集合唯一真源 = 落盘 done 文件**；内存关联数组仅同跑内加速，必须与文件同步——发送成功须**同时** `printf '%s\\n' >> DONE`（显式 LF，绝不写 `\\r`）**且** `DONESET[$jid]=1`。只写内存不同步 = 续跑读到过期快照 = 重发。\n- **key 必须归一化**：`read` / 比较前 `d=\"${d%$'\\r'}\"` 剥 `\\r`。CRLF/LF 混行会把同一岗位存成 `BJ-EXT01` 与 `BJ-EXT01\\r` 两个 key，跳过判定逐字节失配 → 误判\"未发\" → 重发。\n  - 💥 **2026-07-28 真实事故根因**：`.work/_send_done.txt` 前段 python 写 CRLF、后段 bash `echo >>` 写 LF，混行；驱动内存集合与文件不同步、无并发锁 → `DONESET` 加载出 23 个 key（逻辑仅 19 岗）→ **EXT01/03/04/05 各被发 2 次**（BOSS 开场白气泡=2 实锤）。\n- **并发锁**：发送前 `mkdir` 锁目录，实例重叠直接退出（\"另一个发送实例正在运行\"），杜绝双实例读过期快照重发。\n- **启动即停**：done 已覆盖全部待发 → 直接退出，绝不空跑。\n- **终态以 BOSS 实锤为准**：不轻信编排 rc 日志（中断 / 草稿失败码会误判）；某岗是否真发出以「继续沟通」按钮 / 开场白气泡数为准。\n- 仍须遵守 R5（每岗授权）/ R4（撞墙停手）/ 通用红线（前台人工在环，禁无人值守后台）。\n\n---\n\n## 通用红线补强\n\n- ⛔ **禁止频繁开关 tab**：一次 `browse-start` 后保持 tab 打开复用，结束/用户要求才 `browse-end`。\n  频繁开关 = 反作弊高风险。\n- ⛔ **禁止在本地 / 预览面板打开任何 BOSS 页面 HTML**：`browse-html` / `extract` 落盘的 HTML 仅供解析，\n  绝不 `present` 或本地浏览器打开（会被误判为「用自己的浏览器操作 BOSS」）。所有交互只在运行时 Chrome（noVNC）内经 brs.js。\n- ⛔ **UI 交互用语义化原语**：`ui move/click/scroll/type` 必须带 `--selector` 或 `--targetText`\n  按真实元素定位，**禁止盲坐标点击**（防误触「立即沟通/投递」）。`scroll` 用 `--delta`。\n- 🔒 **风险监测期最小动作**：账号刚解封 / 处于风控监测时，默认只读（browse-html / 增量扫描）；\n  任何改状态动作须用户显式逐岗授权 + 预飞 1 岗。\n- 🔒 **状态变更动作禁止无人值守后台**：书签 / 发送须**前台、逐岗、人工实时在环**执行，人可随时叫停。\n  即使已 `AUTHORIZED=1`，也**禁止**委托无人值守后台 agent 批量跑——撞墙无人接手、无法中断、会话结束即死。\n  仅**只读**操作（检索 / 读JD / 扫描）可后台。\n\n---\n\n## R11 登录态：失败驱动，禁止主动预飞\n\n- **机制真相**：浏览器 runtime 用持久化 profile（cookie 在挂载卷），BOSS 登录态跨容器重启都在，仅 cookie 过期才失效（非每小时）。无需每轮校验。\n- **默认信任「已登录」**：仅在真实操作卡住时才质疑。`check_logged_in` 仅由失败分支调用——搜到 0 卡片、或发送 UNKNOWN 时——命中登录页信号才置 `logged_out` + `exit 8`。\n- **状态位置**：`<skill_root>/.state/login_state`（跟随 skill 自身安装目录，产品无关，适配 WorkBuddy/Claude Code/Codex/OpenClaw/Solo…；位于 skills 目录下非 git 仓库，不进 GitHub）。\n- **自动恢复**：人工 noVNC 重登后，下一成功操作（搜到卡片 / 发送 SENT）自动置回 `logged_in`，无需额外握手。\n- docker 启动 / 开 tab 是「直接去做、失败即 fail-loud」的必要动作，不算主动校验。\n\n---\n\n## R12 反作弊红线：只允许受控运行时，禁止任何浏览器扩展直控\n\n- ⛔ **BOSS 直聘禁止任何 Agent 的浏览器扩展直控**——无论 WorkBuddy / Codex / Claude Code / OpenClaw / Solo，凡经浏览器扩展（如 Codex `@Chrome`、CloakBrowser 之类）直接驱动 BOSS 的行为，都属反作弊重点打击对象，会触发封号。\n- ✅ **唯一 sanctioned 后端 = `brs`（agent-browser-runtime）**：受控 Chromium + 自带 companion 模拟真实光标/键鼠，与 Agent 解耦、跨平台（Docker）、对 BOSS 表现为真人操作。\n- **硬失败而非文档约束**：`common.sh` 在加载后端时显式拒绝 `BZC_BACKEND=codex|cloak`（`exit 1` + 安装链接），把「禁止扩展直控」从事后文档升级为可执行拦截。`codex.sh`/`cloak.sh` 已移入 `backends/_deprecated/` 并加 ⛔ 头，仅供其他站点参考 `bz_*` 抽象。\n- 新增浏览器后端同样须是「受控运行时」（真实光标 + 持久登录态 + 反检测），禁止扩展直驱式。\n\n\n## 十、失败分类与恢复（异常 → 动作）\n\n> 任何失败都要 **fail-loud 或受控重试**，**禁止静默吞错**（静默 = 误判 = 误触）。\n\n| 异常 | 判定信号 | 动作 |\n|---|---|---|\n| 解析空字段 / 面板未渲染 | 解析 title/url 为空 | 先 `bz_wait` 等元素就绪 → 重试 1 次；仍空则 `FAIL_LOUD`，不静默 |\n| 选择器漂移 / 失效 | 关键字段全空或选择器 0 命中 | 回 `boss_selectors.md` 复核并更新条目，**禁止绕过**（绕过=误触） |\n| 撞验证墙 | 含「验证码/滑块/安全验证/请完成」 | `exit 3`，停手交人工，冷却 ≥24h，绝不恢复自动化 |\n| 软限流（操作频繁提示） | 页面提示「操作频繁」 | 立即 `rate_backoff` 拉长间隔 + 暂停；仍触发则停手 |\n| 部分加载（滚动未到底） | 卡数连续 2 轮不变但未达预期 | 等待稳定后重试滚动；仍不全则按已得数据继续，不卡死 |\n| 网络 / CONNECT 失败 | 连接拒绝 / 超时 | 重连 1 次；仍失败则停手，不突发重试 |\n| 凭证 / 扩展未连接 | `bz_status` 报 `extensionConnected:false` | `FAIL_LOUD`，等 noVNC 登录并确认扩展连接后再跑 |\n| 日上限 | `bump_daily_cap` 超 `DAILY_CAP` | `exit 5` 停手，次日或显式调高配额 |\n| 岗位已关闭/下架 | 页面含「职位已关闭」但无 `.btn-startchat` | `exit 6` 跳过该岗（**非撞墙**，不冷却），请在岗位库标记「岗位关闭」 |\n| 登录态失效 | 搜索 0 结果且登录页信号 / 发送 UNKNOWN 且登录页信号 | 置 `logged_out` + `exit 8`，请人工 noVNC 重登（无需冷却）；重登后下一成功操作自动置回 `logged_in` |\n\n---\n\n## 接入检查（每次 BOSS 任务前）\n\n- [ ] `brs status` 显示 `extensionConnected: true`？\n- [ ] 只调 brs.js，无裸 CDP / 合成点击 / 查询串捷径？\n- [ ] 限速已遵守（间隔≥5s、日≤100）？\n- [ ] 撞墙会停手 ≥24h？\n- [ ] 发消息每岗有用户授权？\n- [ ] 批量发送编排有 done 追踪 + key 归一化 + 并发锁（R10）？\n- [ ] 同岗无谓重开已避免（合并打开）？\n- [ ] 预飞 1 岗后再复制其余？\n- [ ] 单 lease 不杀重启？\n- [ ] 复核只看 1 个权威产物？\n\nFile v0.1.0:references/script_catalog.md\n\n# 脚本复用目录（Reuse Catalog · 脚本部分）— boss-zhipin-copilot\n\n> **本文件是「任务 → 该复用的内置脚本」唯一权威映射**（四类资产之一）。任何 Agent 写脚本前**必须先查本表**。\n> 遵循 SKILL.md「🛑 优先复用与增量更新」：表中有则必须复用；发现错误就地改；确属全新才新建并收编 `scripts/` + 登记本表。\n> 选择器 / 页面 / 点位不在此表，索引在 `references/boss_selectors.md`，适用同一原则。\n\n---\n\n## 一、任务 → 精确命令映射\n\n| 你要做的事 | 复用这个（精确命令） | 说明 / 注意 |\n|---|---|---|\n| 生成求职画像草稿 | `bash scripts/run_py.sh build_profile.py --goal \"...\" [--resume 简历.md] --out profile.yaml` | 草稿，Agent 必须复核补全 `hard_exclude` / `boost_keywords` / `fact_anchors` |\n| 初始化空岗位库 | `bash scripts/setup_library.sh`（可用 `LIB_CSV` 指定路径） | 按模板生成 `target_library.csv` |\n| **多词检索 + 收集结果卡（只读，源头六维筛选）** | `bash scripts/search_jobs.sh --profile profile.yaml --out .work/candidates.csv [--intent \"自然语言意图\"] [--scale \"302,303\"] [--stage 804,805] [--exp 106] [--degree 203] [--salary 406] [--jobtype 1901]` | 查询词取自 `profile.search.queries`（或 `--queries \"a,b\"`）；走 `bz_*` 真实光标、复用同 tab；产 `candidates.csv`（岗位名/公司名/城市/经验要求/URL，**无薪资**）。内部调 `parse_search.py` + `intent_filters.py`。**六维度筛选在结果页源头应用**：`--intent \"文本\"` 自动解析隐含条件（如\"B轮以上中型公司\"），否则由 `profile.thresholds` 推导（scale_min/max、salary_floor、seniority_years），或显式 `--scale/--stage/--exp/--degree/--salary/--jobtype` 覆盖（优先级：profile < intent < 显式）。**源头筛掉不符岗，勿等读 JD 才筛**；编码/点位/应用配方见 `boss_selectors.md` 五「结果页筛选器」 |\n| **解析求职意图 → 筛选编码** | `bash scripts/run_py.sh intent_filters.py parse \"自然语言\" [--profile p.yaml]` | 自由文本 → FilterSpec（意图覆盖 profile 默认）；`build` 子命令合并 profile+意图+显式维度覆盖；`apply-plan` 输出可点击 TSV。**复用内置，禁现写等价解析** |\n| **过滤 + 打分 + 去重（只读候选清单，不动账号）** | `bash scripts/run_py.sh filter_library.py --profile profile.yaml --input candidates.csv --out .work/eval.json` | **省略 `--library` = 不入库、只产出 `eval.json`（`passed`/`rejected` + 评分）**；需 Top-N 自行按「评分」截断排序 |\n| **过滤 + 打分 + 去重 + 入库** | `... --library target_library.csv` | 通过项追加进库（状态=已收藏(感兴趣)），按 URL 去重 |\n| 单岗读 JD / 招聘方 | `bash scripts/process_job.sh --url <url> --read-jd --out .work/recruiter_jd.json` | 内部调 `parse_job.py`；真实招聘方 = `.job-boss-info .name`（**非 `user-nav` 本人**） |\n| **批量读 JD（N 个）** | `for u in $(cat urls.txt); do bash scripts/process_job.sh --url \"$u\" --read-jd --out .work/jd_$((++n)).json; done` | **禁止另写 `read_jd_batch.py`**；循环复用单岗命令，白赚真实光标 + 撞墙检查 + 解析 |\n| 单岗书签（改状态） | `AUTHORIZED=1 bash scripts/process_job.sh --url <url> --bookmark` | 需批次授权；未授权 `exit 4` |\n| 单岗发送（改状态） | `AUTHORIZED=1 bash scripts/process_job.sh --url <url> --send --msg 话术.txt` | 每岗授权 |\n| 扫描聊天列表（只读） | `bash scripts/scan_chat.sh [--out .work/chat_scan.json]` | 调 `zhipin-chat.extract.js`，与库按 `(name,company,role)` 去重 |\n| 话术自检 gate | `bash scripts/run_py.sh audit_icebreaker.py .work/recruiter_jd.json 话术.md 事实库.md keys.json` | 要求 JD≥90% 且 事实≥90% |\n| 后端闸门 / 撞墙 / 限速 | （由 `common.sh` 自动提供，脚本 `source` 即生效） | 不要绕过、不要自写冷却 |\n\n---\n\n## 二、检索 / 收集（已内置，直接复用）\n\n- **多词检索**：`scripts/search_jobs.sh`（走 `bz_*` 契约、复用同 tab、只读）。禁再写 `run_searches.sh` 等价物。\n- **卡片解析**：`scripts/parse_search.py`（解析 `a.job-name` / `.boss-name` / `.company-location` / `.tag-list`；**不提取薪资**——卡片薪资被字体反爬混淆）。由 `search_jobs.sh` 内部调用。\n- 选择器见 `references/boss_selectors.md`：搜索框 `.search-input-box .input` + `.search-btn`；卡片 `a.job-name`/`.boss-name`/`.company-location`/`.tag-list`。首次跑预飞 1 词校验。\n- **结果页筛选器**（公司规模/融资阶段/工作经验/学历要求/薪资待遇/求职类型，hover 出下拉、部分复选）：点位与 `ka` 编码全表见 `boss_selectors.md` 五「结果页筛选器」。**六维度全覆盖已内置**——`search_jobs.sh` 经 `intent_filters.py` 自动把 profile / 用户自然语言意图 / 显式参数 映射成筛选编码并 hover→click 应用。`intent_filters.py` 是「中文意图 ↔ BOSS 编码」唯一事实来源（禁现写等价解析）。应用配方：触发器用**结构选择器** `.condition-filter-select:has(li[ka=\"sel-job-rec-<dim>-0\"]) .current-select` 定位，禁 `--targetText` 文本定位（会命中页面其它文本）；每点一档后须重新 hover 再点下一档。\n\n---\n\n## 三、反模式（违反 = 立即停用，改用内置）\n\n> 🚫 **违规判定**：用 `Write` 创建对标已有内置脚本的文件（`run_searches.sh` / `parse_search.py` / `filter_candidates.py` / `read_jd_batch.py` / `search.py` / `run_search*.sh` 等）= **违反复用铁律**，必须立即停用并改用内置对应脚本。\n\n- ❌ 写 `run_searches.sh` / `parse_search.py` 等价物 → 已内置，复用 `search_jobs.sh` + `parse_search.py`。\n- ❌ 写 `filter_candidates.py` 重做去重 / 过滤 / 打分 → 复用 `filter_library.py`（只读省略 `--library`）。\n- ❌ 写 `read_jd_batch.py` 重做批量读 JD → shell 循环 `process_job.sh --read-jd`。\n- ❌ 从搜索卡片直读薪资 → 字体混淆，薪资须从 JD 详情页取。\n- ❌ 裸 `node brs.js` / `cd agent-browser-runtime` 绕过后端抽象 → 一律走 `bz_*` 契约（`source common.sh`）。\n\n---\n\n## 四、复用发现问题怎么办（受控逃逸阀 · 见 SKILL.md ④）\n\n1. **先用内置脚本跑**；若发现 bug / 局限 → **优先就地改**该脚本（fix-in-place），让所有未来运行受益。\n2. 若需求**确实全新**、与现有脚本无重叠 → **新建**脚本，收编进 `scripts/`，并在本表登记精确命令。\n3. 无论「改」还是「新建」，**未来同一需求一律复用该脚本，禁止每次重造**。\n\n> ⚠️ **逃逸阀受控闸门**：新建脚本前，**必须在回复中显式列出「已审视的 `scripts/` 清单 + 为何现有脚本不适用」**；无法说清「为何不适用」时，**默认就地改现有脚本**，不得新建。新建后**必须**在本表登记精确命令，否则下次仍会被当「新需求」重造。\n\n> 目的：skill 预建脚本就是为了消除「Agent 每次任务现写脚本」带来的误差与低效率。复用是第一原则；改/新建是受控的逃逸阀，且必须沉淀回 skill。\n\nFile v0.1.0:references/target_library_schema.md\n\n# 目标岗位库 Schema（target_library.csv）\n\n> 本文件是 `boss-zhipin-copilot` 的**数据契约**：检索 / 去重 / 入库的唯一权威数据源。\n> 默认位置：`./target_library.csv` 或 `$LIB_CSV` 指向的文件。\n> 脚本按**表头字典键**映射，可增减列，不依赖列序号。\n\n---\n\n## 一、库的地位\n\n- 任何「已收藏 / 已沟通 / 放弃」状态变更，必须回写本库（真实结果，不记假数据）。\n- 跨运行去重以 `URL` 为唯一主键：已入库 URL 不再重复收藏。\n- 本库与 `profile.yaml` 解耦：`profile` 决定「收不收」，`library` 只记录「收了什么」。\n\n---\n\n## 二、推荐表头（29 列以内，可裁剪）\n\n| 列名 | 说明 |\n|---|---|\n| 岗位ID | 站内编号（如 `BJ-0001`），按库最大号 +1 起算 |\n| 岗位名 | 岗位名 |\n| 公司名 | 公司名 |\n| 公司规模 | 如 `100-499人` / `10000人以上` |\n| 公司阶段 | 成长期 / 不需要融资 / 未融资 / 已上市 / 天使轮 / … |\n| 行业 | 行业标签 |\n| 城市 | 工作城市 |\n| 薪资 | 原始薪资文本（如 `25K` / `40-60K·14薪`） |\n| 经验要求 | 如 `5-10年` |\n| 类型 | 如 `策略产品` / `增长` / `C端` / `AI应用` |\n| 状态 | 见下方状态词表 |\n| URL | 岗位详情页 URL（去重主键） |\n| 评分 | `filter_library.py` 计算的 0–100 分 |\n| 排除原因 | 被硬排除/未过门槛的原因（通过则为空） |\n| 招聘方 | 真实招聘方姓名（来自 `.job-boss-info .name`，**非登录账号**） |\n| 更新时间 | 最近一次写入/变更时间（ISO） |\n\n---\n\n## 三、状态取值（子串匹配跳过）\n\n过滤器用子串匹配以下词跳过已处理行：\n\n- `已沟通`（含 `已沟通-已读不回` / `已沟通-已送达` / `已沟通-已回复` / `已沟通-已婉拒` 等）\n- `已收藏`（含 `已收藏(未沟通)` / `已收藏(感兴趣)`）\n- `放弃`（含 `已放弃` / `放弃`）\n\n> 入库时只写真实结果：书签成功写 `已收藏(感兴趣)`，发送成功写 `已沟通-已送达`，\n> 用户放弃写 `放弃`。**绝不记假数据**。\n\n---\n\n## 四、与 profile 的关系\n\n- `profile.hard_exclude` / `profile.thresholds` / `profile.boost_keywords`\n  由 `filter_library.py` 读取，决定每行「收 / 不收 / 评分多少」。\n- 本 schema 不预置任何城市的薪资硬编码——一切由 `profile` 决定。\n\n---\n\n## 五、初始化\n\n- 首次使用：`bash scripts/setup_library.sh` 按模板生成空 CSV（含表头）。\n- 或复制 `assets/target_library_template.csv` 自行改名。\n\nFile v0.1.0:CHANGELOG.md\n\n# Changelog\n\n本 skill 的所有重要变更记录于此。格式遵循 [Keep a Changelog](https://keepachangelog.com/)。\n\n**版本编号规则**：每一次 commit 递增一个末位号（`0.0.1 → 0.0.2 → …`），阶段性里程碑进位。全部历史提交已回溯打 tag，对照表见文末[「版本对照表」](#版本对照表)。\n\n## [1.0.4] - 2026-08-09 - 建立版本管理\n\n### Added\n- **回溯打 tag**：为全部 17 次历史提交补打带注释的 `v0.0.1` → `v1.0.3` 标签（tag 时间对齐原提交时间），GitHub Releases 时间线可用，从此可按版本引用与回滚，不必再报 commit hash。\n- **`SKILL.md` frontmatter 新增 `version` 字段**（当前 `1.0.4`），skill 自带版本声明。\n- CHANGELOG 补充「版本编号规则」与「版本对照表」，历史条目由日期标题改为 `[版本号] - 日期` 标准形式。\n\n## [1.0.3] - 2026-08-09 - README 架构重画 + 文档/代码对齐修复\n\n### Changed\n- **README 架构图重画为三层**（Agent 产品层 → skill 应用层 → 浏览器后端层 → zhipin.com）。此前移除 Codex 框时只删了框、留下悬空的分支连线，图形残缺；现每行等宽对齐，并显式区分「**Agent 产品**用什么随意（含 Codex）」与「**浏览器后端**只能是 `brs`」这两层——避免把 R12 误读成\"禁止用 Codex 跑这个 skill\"。\n- **徽章**：`works with` 拆成 `agent`（WorkBuddy / OpenClaw / Claude Code / Codex）+ `browser backend: brs only (R12)` 两枚，语义不再混淆。\n- **前置依赖**：Python 要求写明 3.10+，补充「自动探测 PATH / 受管解释器 / venv，勿自建外部垫片绕过预检层」，新增 `preflight_env.sh` 一键自检项。\n- **安全段限速数值与代码对齐**：改为「5s±3s 抖动（书签 8s / 发送 20s）、`DAILY_CAP=100` 超限 `exit 5`、命中软限流指数退避 5→10→20→40 封顶 60s」（原「间隔≥5s」与抖动实现不符）。\n- **快速开始**：第 2 步补上实际存在的 `scripts/search_jobs.sh`（原文仅写「Agent 执行」，与\"禁现写等价物\"的复用铁律冲突）；`candidates.csv` 路径统一到 `.work/`；`profile.yaml` 示例补 `goal` 字段。\n- **目录结构树补全**：新增 `CHANGELOG.md` / `preflight_env.sh` / `run_py.sh` / `strip_title.py`（此前缺失）。\n- **贡献指南**：新增后端须为受控运行时（R12）；新增 Python 脚本须经 `run_py.sh` 调用并登记 `script_catalog.md`。\n\n### Fixed\n- `process_job.sh`：临时文件 `.parse_job.tmp` 默认目录由 `.`（工作区根）改为 `.work/`，并为 `.parse_job.tmp` / `.verify_html3.tmp` 补 `mkdir -p` 兜底——修复根目录被临时文件污染的根因，以及纯 `--send`（不经 read-jd）路径下 `.work/` 不存在导致写入失败的隐患。\n\n## [1.0.2] - 2026-08-05 - brs-only 安全收口 + R12 反作弊 + 便携运行器\n\n> 含 `v1.0.1`（主体改动）与 `v1.0.2`（`.gitignore` 忽略本地 `.learnings/`）两次提交。\n\n### Added\n- **R12 反作弊红线**：BOSS 直聘禁止**任何 Agent** 的浏览器扩展直控（含 Codex `@Chrome` / CloakBrowser）。skill 统一 **brs 单后端**（agent-browser-runtime 受控运行时）；`BZC_BACKEND=codex|cloak` 被 `common.sh` 硬拒绝（`exit 1` + 安装链接），把\"禁止扩展直控\"从文档约束升级为可执行拦截。\n- **`scripts/run_py.sh`**：便携 Python 运行器（`source common.sh` 取 `$PYTHON` + `to_win_path`），消除受管环境无 `python3` 直跑失败；SKILL/README/script_catalog 全部改 `bash scripts/run_py.sh`。\n- **`bz_wait` / `rate_backoff` 接线**：读 JD 前 `bz_wait` 等渲染就绪（防空串）；发送后命中「操作频繁」触发指数退避。\n- **错误处理补全 `exit 6`**：职位已关闭/下架（页面含「职位已关闭」但无 `.btn-startchat`）→ 跳过该岗，**非撞墙**，不冷却。\n- **`references/safety_rules.md` 新增 R12 段**；SKILL/README/browser_backend 安全纪律统一升至 **R1–R12**。\n\n### Changed\n- `codex.sh` / `cloak.sh` 移入 `scripts/backends/_deprecated/` 并加 ⛔ 头（仅供其他站点参考 `bz_*` 抽象，绝不用于 BOSS）。\n- `filter_library.py`：`REQUIRED_FIELDS` 去掉「薪资」（搜索候选池因反爬无薪资列，`salary_floor` 此前静默死）；薪资门槛仅 JD 富化后的库生效（已知限制，已注释说明）。\n- `strip_title.py`：正则第二截 `{2,6}` → `{2,4}`，修复误剥「王芳 感谢您的回复」类正常消息首行。\n- Axis B 预检层：`preflight_env.sh` 自举 `sleep`/`seq`、`resolve_python` 强制校验 PyYAML、`to_win_path` 替代裸 `cygpath`；删除 `.work/runtime_env.sh` 冗余绷带（绕过原生层会\"测的不是 skill\"）。\n- 文档一致性：SKILL.md / README.md / browser_backend.md / safety_rules.md / script_catalog.md 清除过时的「hosted 短路 emit_plan」「R1–R9」「hosted codex 边界」等表述，与 brs-only + R1–R12 现状对齐。\n\n### Removed\n- 公开仓库不再收录任何浏览器扩展直控后端；`codex`/`cloak` 不再出现在\"支持后端\"清单。\n\n---\n\n## 版本对照表\n\n`v1.0.2` 之前的版本为回溯补打的 tag，条目未逐个展开；完整信息见 `git show v<版本号>`。\n\n| 版本 | 日期 | commit | 说明 |\n|---|---|---|---|\n| `v0.0.1` | 2026-07-20 | `e36378b` | 初版：通用 BOSS 直聘求职 copilot skill |\n| `v0.0.2` | 2026-07-20 | `15c2cc6` | 文档层审查缺陷 P2/C11/C12 + 契约说明 |\n| `v0.0.3` | 2026-07-20 | `79de80c` | 合并代码层 + 文档层审查修复 |\n| `v0.0.4` | 2026-07-20 | `f281833` | V2 审查 N1–N7（面议误杀/分块碰撞/日限额持久化） |\n| `v0.0.5` | 2026-07-20 | `36dd4bc` | LICENSE 版权署名修正 |\n| `v0.0.6` | 2026-07-20 | `c7527f5` | 清理 SKILL/README 迭代噪音 |\n| `v0.0.7` | 2026-07-20 | `0b4ba18` | README 加 GitHub 状态徽章 |\n| `v0.0.8` | 2026-07-20 | `5d3a31a` | SKILL.md 二次压缩 + 美化 |\n| `v0.0.9` | 2026-07-20 | `e8de0a0` | SKILL.md 删冗余 H1 |\n| **`v0.1.0`** | 2026-07-20 | `11677ff` | **里程碑**：frontmatter 压缩，初版文档定型 |\n| `v0.1.1` | 2026-07-21 | `a761e13` | 收编搜索脚本 + 复用铁律机制化 + V4 修复 |\n| `v0.1.2` | 2026-07-23 | `faa40eb` | 复用原则泛化 + win-native 适配 + 禁无人值守后台 |\n| `v0.1.3` | 2026-07-23 | `ee2fe49` | V5 审查逐条核实 + 迭代纪律固化 |\n| **`v1.0.0`** | 2026-07-25 | `d338517` | **首个稳定版**：发送校验去空白匹配 + 防御性剥离标题行 |\n| `v1.0.1` | 2026-08-05 | `a3c242a` | brs-only 安全收口 + R12 反作弊 + 便携运行器 |\n| `v1.0.2` | 2026-08-05 | `22de1eb` | 忽略本地 `.learnings/` |\n| `v1.0.3` | 2026-08-09 | `241f179` | README 架构图重画为三层 + 文档/代码对齐 |\n| `v1.0.4` | 2026-08-09 | — | 建立版本管理（回溯打 tag + version 字段 + 本表） |\n\nFile v0.1.0:skill-card.md\n\n## Description:\n\nA BOSS Zhipin job-search copilot that helps agents turn a resume and target role into a profile, collect and filter jobs, read job descriptions, draft icebreaker messages, and send messages only after authorization.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[huagavin](https://clawhub.ai/user/huagavin)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nJob seekers and their authorized agents use this skill to structure BOSS Zhipin searches, maintain a target-job library, review job descriptions, draft tailored outreach, and optionally send approved messages through controlled browser actions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can drive an authenticated browser to job URLs and perform account-state-changing actions.\n\nMitigation: Run only on verified https://www.zhipin.com/job_detail/... URLs and review the exact job URL and message text before setting AUTHORIZED=1.\n\nRisk: Backend shell code can be selected through environment-controlled paths.\n\nMitigation: Use trusted local copies of agent-browser-runtime, set BZC_BACKEND=brs, and avoid BRS_JS or BZC_BACKEND overrides from untrusted environments.\n\nRisk: Automated interaction with BOSS Zhipin can trigger platform anti-abuse controls if it bypasses the intended runtime or runs too aggressively.\n\nMitigation: Use the real-cursor brs backend, keep the documented rate limits and daily caps, stop on verification challenges, and require human review for sending.\n\n## Reference(s):\n\n- [Server-resolved source repository](https://github.com/HuaGavin/boss-zhipin-copilot)\n- [ClawHub skill page](https://clawhub.ai/huagavin/skills/boss-zhipin-copilot)\n- [agent-browser-runtime](https://github.com/energypantry/agent-browser-runtime)\n- [Safety rules](references/safety_rules.md)\n- [Browser backend contract](references/browser_backend.md)\n- [Script catalog](references/script_catalog.md)\n- [BOSS selector reference](references/boss_selectors.md)\n- [Profile schema](references/profile_schema.md)\n- [Target library schema](references/target_library_schema.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with shell commands, local configuration files, CSV and JSON artifacts, and message drafts]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires user authorization before bookmark or send actions; read-only collection and drafting can produce local intermediate files.]\n\n## Skill Version(s):\n\n0.1.0 (source: ClawHub release metadata; artifact frontmatter and changelog report 1.0.4)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.","readmeExcerpt":"Skill: BOSS直聘仿人求职助手 Owner: huagavin Summary: 通用 BOSS 直聘求职 copilot：配合仿真人浏览器后端用真实光标安全检索/收藏岗位、读 JD、写破冰话术并按授权发送。强制走后端正门、真实光标、限速、撞墙停手、授权门控，绝不裸 CDP。四类资产（脚本/选择器/页面/点位）一律优先复用 skill 内置，禁止现写等价脚本或重猜选择器；新建前必查 script_catalog.md + boss_selectors.md。 Tags: latest:0.1.0 Version history: v0.1.0 | 2026-08-09T13:57:24.485Z | auto boss-zhipin-copilot v0.1.0 - Initial public release of a configurable, open-source BOSS Zhipin job search c","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"DONE=\".work/send_done.txt\"; LOCK=\".work/.send_lock\"\n  mkdir \"$LOCK\" 2>/dev/null || { echo \"另一个发送实例正在运行\"; exit 1; }\n  trap 'rmdir \"$LOCK\" 2>/dev/null' EXIT\n  declare -A DONESET\n  [ -f \"$DONE\" ] && while read -r d; do d=\"${d%$'\\r'}\"; [ -n \"$d\" ] && DONESET[\"$d\"]=1; done < \"$DONE\"\n  # urls.txt: 每行 <jid><TAB><url><TAB><薪资>\n  while IFS=$'\\t' read -r jid url sal; do\n    [ -z \"$jid\" ] && continue\n    jid=\"${jid%$'\\r'}\"\n    [ \"${DONESET[$jid]:-}\" = \"1\" ] && { echo \"[skip] $jid\"; continue; }\n    AUTHORIZED=1 bash scripts/process_job.sh --url \"$url\" --send --msg \".work/msg/$jid.txt\" \\\n      || { echo \"发送失败/撞墙 $jid，停手\"; break; }\n    printf '%s\\n' \"$jid\" >> \"$DONE\"   # 文件落盘（显式 LF）\n    DONESET[\"$jid\"]=1                  # 内存同步（同跑内防重）\n  done < urls.txt"},{"language":"text","snippet":"┌──────────────────────────────────────────────────────────────┐\n│  Agent 产品层：谁来跑这个 skill                              │\n│  WorkBuddy / OpenClaw / Claude Code / Codex 等任意 Agent     │\n└───────────────────────────┬──────────────────────────────────┘\n                            │  读 SKILL.md，按工作流调用 scripts/\n┌───────────────────────────▼──────────────────────────────────┐\n│  boss-zhipin-copilot（本 skill = 应用层）                    │\n│  SKILL.md + scripts/(bash+python) + references/ + assets/    │\n│  只对 BrowserDriver 契约 bz_* 编程，不耦合具体浏览器实现     │\n└───────────────────────────┬──────────────────────────────────┘\n                            │  common.sh 探测并 source backends/brs.sh\n┌───────────────────────────▼──────────────────────────────────┐\n│  浏览器后端层：brs = agent-browser-runtime                   │\n│  受控 Chromium + companion：真实光标 / 持久登录 / 反检测     │\n│  唯一 sanctioned 后端：绝不裸 CDP、绝不扩展直控（R12）       │\n└───────────────────────────┬──────────────────────────────────┘\n                            │  真实光标事件（非 CDP 合成、非扩展直控）\n                            ▼\n                  ┌────────────────────┐\n                  │  zhipin.com（BOSS）│\n                  └────────────────────┘"},{"language":"bash","snippet":"# 克隆（或下载 ZIP）\ngit clone https://github.com/HuaGavin/boss-zhipin-copilot.git boss-zhipin-copilot\n\n# WorkBuddy: 拷到项目级或用户级 skills 目录\ncp -r boss-zhipin-copilot ~/.workbuddy/skills/        # 用户级\n# 或  <项目根>/.workbuddy/skills/                          # 项目级\n\n# OpenClaw: 拷到 skills 目录\ncp -r boss-zhipin-copilot ~/.openclaw/skills/\n\n# 安装 Python 依赖\ncd boss-zhipin-copilot\npip install -r requirements.txt"},{"language":"bash","snippet":"# 默认（本地全自动）：agent-browser-runtime\nexport BZC_BACKEND=brs\nexport BRS_JS=\"/绝对路径/agent-browser-runtime/cli/brs.js\"   # 或 AGENT_BROWSER_RUNTIME_HOME"},{"language":"bash","snippet":"cd boss-zhipin-copilot\n\n# 0) 生成求职画像（从一句目标 + 可选简历）\nbash scripts/run_py.sh build_profile.py \\\n  --goal \"我想找要求5年以上经验、月薪4万元以上的策略产品经理岗位（北京）\" \\\n  --resume 我的简历.md --out profile.yaml\n# → Agent 复核补全 hard_exclude / boost_keywords / fact_anchors\n\n# 1) 初始化岗位库\nbash scripts/setup_library.sh\n\n# 2) 在 BOSS 用真实 UI 搜索 profile.search.queries，收集结果卡片到 candidates.csv\n#    （真实光标走搜索框，禁止拼接搜索 URL 捷径；可加 --intent \"自然语言\" 自动映射筛选器）\nbash scripts/search_jobs.sh --profile profile.yaml --out .work/candidates.csv\n\n#    然后过滤 + 评分 + 入库：\nbash scripts/run_py.sh filter_library.py \\\n  --profile profile.yaml --input .work/candidates.csv \\\n  --library target_library.csv --out .work/eval.json\n\n# 3) 对每个通过项书签（真实光标）\nAUTHORIZED=1 bash scripts/process_job.sh --url <岗位URL> --bookmark\n\n# 4) 读 JD（备话术）\nbash scripts/process_job.sh --url <岗位URL> --read-jd --out .work/recruiter_jd.json\n\n# 5) 写破冰话术 + 自检 gate（详见 SKILL.md Step 4）\nbash scripts/run_py.sh audit_icebreaker.py .work/recruiter_jd.json 话术.md 事实库.md keys.json\n\n# 6) 用户授权后发送（或仅本地成稿）\nAUTHORIZED=1 bash scripts/process_job.sh --url <岗位URL> --send --msg 话术.txt"},{"language":"yaml","snippet":"meta:                       # 可选：候选人标识（可空，不写也行）\n  candidate_name: \"你的名字\"\ngoal: \"我想找5年以上经验、月薪4万以上的策略产品经理岗位（北京）\"   # 原始目标句，存档回溯\nsearch:\n  city: \"北京\"\n  queries: [\"策略产品经理 北京\"]\nthresholds:\n  salary_floor: 40000      # 月薪下限（元），0=不限\n  seniority_years: 5       # 经验年限下限，0=不限\nhard_exclude:              # 命中任一即不入库（只列你确实无经验的类）\n  - category: \"广告/IAA\"\n    keywords: [\"IAA\", \"广告变现\", \"买量\"]\nboost_keywords: [\"增长\", \"留存\", \"C端\", \"0-1\", \"Agent\"]\nfact_anchors:              # 破冰事实锚点，必须真实可溯源\n  - anchor: \"用户增长\"\n    evidence: \"某内容平台渠道增长，次留提升 3%\""}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: boss-zhipin-copilot\nversion: 1.0.4\ndescription: >-\n  通用 BOSS 直聘求职 copilot：配合仿真人浏览器后端用真实光标安全检索/收藏岗位、读 JD、写破冰话术并按授权发送。强制走后端正门、真实光标、限速、撞墙停手、授权门控，绝不裸 CDP。四类资产（脚本/选择器/页面/点位）一律优先复用 skill 内置，禁止现写等价脚本或重猜选择器；新建前必查 script_catalog.md + boss_selectors.md。\n---\n\n通用、可配置、开源的 BOSS 直聘求职 copilot：把「简历 + 求职目标」沉淀为可复用能力——自动建岗位画像与检索词、建评分机制、建岗位库、检索收藏、写破冰话术、按授权发送。\n\n> 🔌 **应用层架构**：浏览器运行时由「仿真人浏览器后端」经 `bz_*` 契约即插即用提供。默认**且仅支持** [agent-browser-runtime](https://github.com/energypantry/agent-browser-runtime)（受控 Chromium + 自带 companion 模拟真实光标）。**所有浏览器动作只经后端正门真实光标执行，绝不直连 CDP、绝不走浏览器扩展直控。**\n\n**流水线**：`简历/目标` → `profile.yaml` → 检索·过滤·入库 → 读 JD → 写话术（自检 gate）→ 授权发送 / 仅本地成稿\n\n> 🛑 **最高优先级前置门控**：任何写脚本 / 猜选择器·页面·点位前，**必须先 `Read references/script_catalog.md` + `references/boss_selectors.md`**（统一原则见下方「🛑 优先复用与增量更新」）。已有对应项时现写即违规——立即停用，改用内置。复用优先于一切。\n\n---\n\n## 何时使用\n- 用户在 BOSS 直聘「找工作 / 建目标岗位库 / 批量收藏 / 写破冰话术 / 发消息」。\n- 触发语：「帮我在 BOSS 找策略产品经理」「根据简历生成求职画像和检索词」「收藏这几个岗位」「写破冰话术」「把这些岗发消息」。\n\n---\n\n## 前置依赖（缺一不可 → fail loud）\n1. **仿真人浏览器后端就绪**（关键准入，裸 CDP / 扩展直控曾致封号）：\n   - 本地（默认且唯一 sanctioned）：部署 [agent-browser-runtime](https://github.com/energypantry/agent-browser-runtime)，`BZC_BACKEND=brs`（默认），`brs status` 须 `extensionConnected: true`。\n   - 缺失 → `common.sh` fail-loud 并贴安装链接。契约见 `references/browser_backend.md`。\n2. **Python3 + PyYAML（硬前置，加载即校验）**：`pip install -r requirements.txt`。`common.sh` 在 source 时即经 `resolve_python()` + `preflight_env.sh` 断言「选中的解释器能 `import yaml`」；PyYAML 缺失直接 **FAIL_LOUD**（不再静默选到缺 yaml 的解释器让解析脚本确定性失败）。未设 `PYTHON` 时按 `PATH(win-native) > 受管 3.13.12 > 受管 venv(envs/default，预装 yaml) > python3` 自动挑第一个带 yaml 的；显式 `PYTHON` 则严格遵从。\n3. **执行环境就绪度（Axis B 预检/引导层）**：`preflight_env.sh` 兜底 coreutils——Git Bash 等会话级环境缺 `sleep`/`seq` 时自动注册等价 shell 函数（零磁盘写入）；脚本路径转换已统一改用 `to_win_path`，不再散落裸 `cygpath -w`（消除「cygpath 缺失 → 静默回退 POSIX 路径 → win-python 误读」的确定性失败）。\n4. **profile.yaml / 岗位库 CSV**：由本 skill 在工作流 Step 0/1 自动生成（无需预置）。\n\n> 🔴 **反作弊红线（R12，硬性）**：BOSS 直聘禁止**任何 Agent** 的浏览器扩展直控（含 Codex `@Chrome` / CloakBrowser 之类）。本 skill **统一 brs 单后端**（agent-browser-runtime 受控运行时）；设 `BZC_BACKEND=codex|cloak` 会被 `common.sh` 直接拒绝（`exit 1` + 安装链接）。公开仓库不收录任何扩展直控后端。\n\n> ⚠️ **运行方式护栏（防绕过原生 Axis B 层）**：跑批时**只设连接变量**——`AGENT_BROWSER_RUNTIME_HOME`（或 `BRS_JS`）+ 必要时 `NODE`（受管 node 绝对路径，如 `$HOME/.workbuddy/binaries/node/versions/<ver>/node`，WorkBuddy 专属示例）。**严禁预置 `PYTHON`、严禁 `source` 任何外部 `runtime_env.sh` / 类似 shim**：那会把 `PYTHON`/cygpath/sleep 写死，绕过本 skill 的 `resolve_python` / `to_win_path` / `preflight_env.sh`，导致\"测的根本不是 skill 本身\"。PyYAML 解析、POSIX→Windows 路径转换、coreutils 兜底**一律由 skill 自供**。\n\n---\n\n## 安全纪律（灵魂 · 全文见 references/safety_rules.md）\n- **R1** 只走仿真人浏览器后端正门，绝不裸 CDP / `Runtime.evaluate` / 查询串捷径。\n- **R2** 只用真实光标（`ui.click`/`ui.type`），禁合成点击。\n- **R3** 限速：动作间隔 ≥`ACTION_INTERVAL_SECONDS`(5s)；每日收藏+开聊 ≤`DAILY_CAP`(100)。\n- **R4** 撞墙即停：验证码/滑块 → `exit 3`，停手交人工，冷却 ≥24h，绝不恢复自动化。\n- **R5** 授权门控：书签需批次授权；发消息需**每岗** `AUTHORIZED=1`。门控在 `process_job.sh` 顶部最早执行，未授权带 `--send`/`--bookmark` 直接 `exit 4`。\n- **R6** 合并打开，避免无谓重开（同次任务合并书签+读JD+授权发送）。\n- **R7** "},{"path":"README.md","content":"# boss-zhipin-copilot\n\n[![Version](https://img.shields.io/github/v/tag/HuaGavin/boss-zhipin-copilot?label=version&color=blue&sort=semver)](CHANGELOG.md)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n[![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](requirements.txt)\n[![Dependencies](https://img.shields.io/badge/deps-pyyaml-lightgrey.svg)](requirements.txt)\n[![Agent](https://img.shields.io/badge/agent-WorkBuddy%20%7C%20OpenClaw%20%7C%20Claude%20Code%20%7C%20Codex-blueviolet.svg)](SKILL.md)\n[![Backend](https://img.shields.io/badge/browser%20backend-brs%20only%20(R12)-critical.svg)](https://github.com/energypantry/agent-browser-runtime)\n\n> 一个通用、可配置、开源的 **BOSS 直聘求职 copilot** skill。\n> 配合「仿真人浏览器后端」（[agent-browser-runtime](https://github.com/energypantry/agent-browser-runtime)，受控 Chromium + companion 真实光标）的真实光标浏览器，\n> 把「简历 + 求职目标」或「一句话目标」沉淀成可复用的能力：\n> **自动生成目标岗位画像与检索词 → 建立评分机制 → 建岗位库 → 在 BOSS 检索/收藏 → 读 JD 写破冰话术 → 按授权发送或仅本地成稿。**\n\n所有浏览器动作只经后端正门**真实光标**执行，强制限速、撞墙停手、授权门控，**绝不裸 CDP、绝不走浏览器扩展直控**。统一 **brs 单后端**（agent-browser-runtime 受控运行时，R12 反作弊红线）；设 `BZC_BACKEND=codex|cloak` 会被 `common.sh` 直接拒绝。\n适用于 WorkBuddy / OpenClaw / Codex / Claude Code 等任意 Agent 产品（Agent 产品指「谁来跑这个 skill」，与浏览器后端无关——BOSS 动作一律走 brs）。\n\n---\n\n## ✨ 特性\n\n- **输入极简**：给「简历/工作事实 + 一句目标」，或只给一个检索词 / 目标句即可启动。\n- **profile 驱动，零硬编码个人偏好**：检索词、硬排除类、评分门槛、破冰事实锚点全部来自 `profile.yaml`，\n  仓库**不预置任何平台的默认排除列表**（避免误杀别人的机会）。\n- **安全内建**：R1–R12 安全纪律全程兜底（真实光标、限速、撞墙冷却≥24h、授权门控、合并打开、预飞复制、单 lease、复核收敛、发送幂等 R10、登录态失败驱动 R11、反作弊单后端 R12）。\n- **完整闭环**：检索 → 过滤 → 书签入库 → 读 JD → 写破冰话术（自检 gate）→ 按授权发送 / 本地成稿。\n- **跨平台可移植**：Bash 负责 CLI 编排（封装 `brs.js`）+ Python 负责数据逻辑；`scripts/preflight_env.sh` 自动探测可用 Python（含受管解释器）并校验依赖，Python 一律经 `scripts/run_py.sh` 调用，无 `python3` 的环境也能直接跑（Windows 走 win-native 路径转换）。\n\n---\n\n## 🧱 架构\n\n三层：**谁来跑**（Agent 产品）→ **跑什么**（本 skill）→ **怎么点浏览器**（后端，唯一 `brs`）。\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│  Agent 产品层：谁来跑这个 skill                              │\n│  WorkBuddy / OpenClaw / Claude Code / Codex 等任意 Agent     │\n└───────────────────────────┬──────────────────────────────────┘\n                            │  读 SKILL.md，按工作流调用 scripts/\n┌───────────────────────────▼──────────────────────────────────┐\n│  boss-zhipin-copilot（本 skill = 应用层）                    │\n│  SKILL.md + scripts/(bash+python) + references/ + assets/    │\n│  只对 BrowserDriver 契约 bz_* 编程，不耦合具体浏览器实现     │\n└───────────────────────────┬──────────────────────────────────┘\n                            │  common.sh 探测并 source backends/brs.sh\n┌───────────────────────────▼──────────────────────────────────┐\n│  浏览器后端层：brs = agent-browser-runtime                   │\n│  受控 Chromium + companion：真实光标 / 持久登录 / 反检测     │\n│  唯一 sanctioned 后端：绝不裸 CDP、绝不扩展直控（R12）       │\n└───────────────────────────┬──────────────────────────────────┘\n                            │  真实光标事件（非 CDP 合成、非扩展直控）\n                            ▼\n                  ┌────────────────────┐\n                  │  zhipin.com（BOSS）│"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn727b0hk04906tj8vp8kzrb3x8763rk\",\n  \"slug\": \"boss-zhipin-copilot\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1786283844485\n}"},{"path":"references/boss_selectors.md","content":"# BOSS 直聘选择器 / 页面 / 点位（需实况校验）\n\n> 本文件是「选择器 / 页面 / 点位」三类资产的唯一权威索引，遵循 SKILL.md「🛑 优先复用与增量更新」原则：\n> **复用优先**（已有条目直接用）、**发现错误就地改**（漂移 → 回本文件更新，**禁止绕过**）、**发现新内容补进对应节**（标「首次校验」）。\n> 选择器来自社区实战提取，**BOSS 前端会改版，可能漂移**；每次大版本先预飞 1 岗确认字段非空再批量。\n\n---\n\n## 一、招聘方 / JD / 公司（读详情用，较稳）\n\n| 用途 | 选择器 | 提取要点 |\n|---|---|---|\n| 招聘方姓名 | `.job-boss-info .name` | 取首行文本，去「在线」二字 |\n| 招聘方职位 | `.boss-info-attr` | 取「·」分隔末段 |\n| 完整 JD | `.job-sec-text` | 回退 `.job-detail-section` / `.text-desc` |\n| 公司 | `.sider-company` | 公司名 + 规模 + 阶段 |\n| ⚠️ 登录账号本人 | `.user-nav` | **严禁**当作招聘方（那是登录用户本人） |\n\n---\n\n## 二、书签按钮（较稳）\n\n| 用途 | 选择器 | 核验 |\n|---|---|---|\n| 感兴趣 | `.btn-interest` | 点击后文本应变「取消感兴趣」；以此核验成功 |\n\n---\n\n## 三、沟通 / 发送（✅ 2026-07-23 实战校准；UI 有两个变体，按序 fallback）\n\n| 用途 | 首选（2026-07-23 实测） | 回退（2026-07-20 变体） | 备注 |\n|---|---|---|---|\n| 立即沟通 | `.btn-startchat` | — | 详情页按钮；点击后进入聊天弹窗（可能自动聚焦输入框） |\n| 输入框 | `#chat-input`（contenteditable div，class=`.chat-input`） | `textarea.input-area` | 两变体并存，先试 `#chat-input` |\n| 发送 | `.btn-send`（`button.btn-v2.btn-sure-v2.btn-send`） | `.send-message` | 先试 `.btn-send` |\n\n- **送达校验（严格）**：发送后重新取 HTML，要求 ①`#chat-input` 编辑框已清空（草稿不残留）②消息区含话术前缀；出现 `status-delivery`（`[送达]`）为最强确认。**仅 grep 页面含话术会误判**——键入未发送时草稿也在页面里。\n- 「职位已关闭」页面无 `.btn-startchat` → 跳过该岗并记库（exit 6），**不算撞墙**，继续批次。\n\n---\n\n## 四、会话列表（✅ 2026-07-23 实测校准）\n\n| 用途 | 选择器（实测） | 备注 |\n|---|---|---|\n| 会话条目 | `.chat-item` / `.friend-content` | 含 (name, company, role) 用于去重 |\n| 滚动容器 | `.user-list` | 真实滚动容器（非外层面板）；提取器已用 `ui.move` 定位 |\n| 最近消息预览 | `.last-msg-text` | 核对我方已发话术是否落盘 |\n| 送达标记 | `status-delivery`（`message-status` 类，文案 `[送达]`） | **最强送达确认**；独立复核聊天列表时逐条确认 [送达] |\n\n- 送达校验双保险：发送后除「编辑框清空 + 消息区含话术」（见三），再到 `/web/geek/chat` 列表核对 `status-delivery` 标记，逐条确认 [送达]（2026-07-23 已用此法独立复核 5 岗）。\n\n---\n\n## 五、搜索框 + 结果卡片（Step 2 检索，search_jobs.sh / parse_search.py）\n\n| 用途 | 选择器 | 备注 |\n|---|---|---|\n| 岗位搜索页 | `https://www.zhipin.com/web/geek/job` | 复用同 tab 导航到此再检索 |\n| 搜索输入 | `.search-input-box .input` | 真实光标点击 → `ui type` 查询词 |\n| 搜索按钮 | `.search-btn` | 提交检索 |\n| 岗位名 + 链接 | `a.job-name`（`href`） | href 形如 `/job_detail/XXX.html` |\n| 公司名 | `.boss-name` | |\n| 城市 | `.company-location` | 如「北京·朝阳区」 |\n| 经验/学历 | `.tag-list li` | 限定卡内，防跨卡串扰 |\n| 薪资 | `.job-salary` | ⚠️ 字体反爬混淆，**禁读**，须从 JD 详情页取 |\n\n> skill 强制**真实 UI 搜索**（键入 + 点搜索），禁止拼接 `?query=&city=&page=` 捷径 URL。\n\n### 结果页筛选器（✅ 2026-07-23 实测校准；hover 出下拉、复选、URL 侧证生效）\n\n搜索提交后结果页 URL 变为 `/web/geek/jobs`，**搜索框正下方**一排筛选触发器（实测 y≈140）。下拉显隐是**纯 CSS `:hover`**（选项 `li` 常驻 DOM，无 open/active 状态类）→ **读选项无需 hover，但真实光标点选前必须先 `ui move` 悬停到触发器让下拉可见**。\n\n| 结构 | 选择器 | 备注 |\n|---|---|---|\n| 筛选器容器 | `.condition-filter-select`（常规）/ `.condition-industry-select`（公司行业）/ `.condition-position-select`（职位类型） | 每个筛选一个容器 |\n| 触发器（hover 点位） | 容器内 `.current-select` | ⚠️ **禁用 `--targetText \"公司规模\"` 定位**——实测命中页面中部其它文本（y=428 非筛选栏 y=142）致 `UI target not found`；须用结构选择器，如 `.condition-filter-select:has(li[ka=\"sel-job-rec-scale-0\"]) .current-select` |\n| 下拉面板 | `.filter-select-dropdown` → `ul.select-list` → `li[ka=...]` | `li` 的 `ka` 属性 = 唯一稳定点位 |\n\n**全部筛选器与 `ka` 编码**（`"},{"path":"references/browser_backend.md","content":"# 浏览器后端（BrowserDriver）契约与兼容清单\n\n本 skill 的所有「浏览器动作」都通过一套 **BrowserDriver 契约** 执行，而不是直接调用某个具体工具。\n这样用户可以用自己已有的「仿真人浏览器」——只要它实现了下面的函数，就能即插即用。\n\n代码入口：`scripts/common.sh` 读取环境变量 `BZC_BACKEND`（默认 `brs`），\n`source scripts/backends/$BZC_BACKEND.sh`，随后所有脚本只调用下面定义的 `bz_*` 函数。\n\n---\n\n## 一、契约：每个后端必须实现的函数\n\n> 约定：所有 `bz_*` 函数由 `backends/<name>.sh` 定义；`common.sh` 在 source 后调用它们。\n> 任何「未就绪 / 撞验证墙 / 未授权」都必须 **fail-loud（非零退出 + 明确 stderr 信息）**。\n\n| 函数 | 入参 | 行为 | 必须 |\n|------|------|------|------|\n| `bz_mode` | 无 | 打印 `local` 或 `hosted` 到 stdout。`hosted`=浏览器由外部 Agent（如 Codex）托管，本 skill 只生成步骤提示词，不实际驱动 | ✅ |\n| `bz_status` | 无 | 运行时就绪闸门。不就绪则 fail-loud（exit≠0）。`hosted` 模式可只打印提示并正常退出 | ✅ |\n| `bz_browse_start` | `<url> [humanize]` | 打开目标页、占用一个租约/标签页；**导出全局变量 `BZ_LEASE` / `BZ_TAB`**（调用方不再解析 stdout）；同时把原始 JSON 打到 stdout | ✅ |\n| `bz_browse_html` | `<lease> <tab>` | 打印当前页 HTML 到 stdout（用于解析 JD / 招聘方 / 撞墙检查） | ✅ |\n| `bz_browse_nav` | `<lease> <tab> <url>` | 复用同一 lease/tab 导航到新 URL（不重开 tab，落实「禁频繁开关」；检索多词复用） | ✅ |\n| `bz_browse_end` | `<lease>` | 释放租约/关闭标签页 | ✅ |\n| `bz_ui` | `<tab> <subcommand...>` | 真实光标 UI 原语：`wait-for --selector` / `click --selector` / `type --text` / `scroll` / `move`。**必须用真实光标，禁止合成点击** | ✅ |\n| `bz_extract` | `<jsfile> <lease> <tab> <params-json>` | 运行页面内提取器（聊天列表扫描等），结果打印到 stdout | 条件（scan_chat 需要） |\n| `bz_emit_plan` | `<原始 argv...>` | 仅 `hosted` 模式需要：把一次浏览器任务翻译成可粘贴到外部 Agent 的步骤提示词 | 条件（hosted 需要） |\n\n通用助手（由 `common.sh` 提供，后端可调用）：\n- `verify_wall <html>`：命中验证墙关键词即 fail-loud（exit 3）。\n- `cooldown <secs>`：限速 sleep（含 ±`COOLDOWN_JITTER` 抖动）。\n- `rate_backoff`：软限流指数退避（间隔按 2^(n-1) 拉长，封顶 `BACKOFF_MAX`），命中「操作频繁」时调用。\n- `bz_wait <lease> <tab> <token> [timeout] [interval]`：轮询当前页直到 `token` 元素出现（就绪闸门），超时 fail-loud；hosted 直接 return 0。\n- `backend_is_hosted`：返回 0 当且仅当 `bz_mode` 为 `hosted`。\n\n**安全纪律（R1–R12，见 safety_rules.md）对一切后端生效**：真实光标、限速、撞墙停手≥24h、授权门控、合并打开复用 lease、预飞复制、单 lease。后端只是「手部」，纪律不变。\n\n---\n\n## 二、已知后端清单与支持矩阵\n\n| 后端 | `BZC_BACKEND` | 模式 | 开源/免费 | 反检测路线 | 本仓库状态 | 安装/文档 |\n|------|---------------|------|-----------|-----------|-----------|-----------|\n| **agent-browser-runtime** | `brs` | local | 开源 MIT | 真实 Chromium + companion 扩展 + broker 租约 + 人性化限速（**唯一 sanctioned 后端，最贴合 BOSS 直聘**） | ✅ **已实现且默认** | https://github.com/energypantry/agent-browser-runtime |\n| **OpenAI Codex** | `codex` | hosted | 需 ChatGPT Plus/Pro + Codex 桌面端 | 真实登录态 Chrome + 官方扩展 + Computer Use 光标 | ⛔ **已废弃（反作弊风险，勿用于 BOSS）**：移入 `backends/_deprecated/`，`common.sh` 拒绝加载 | https://developers.openai.com/codex/app/chrome-extension |\n| **CloakBrowser** | `cloak` | local | 开源 MIT | 源码级改指纹隐身 Chromium + `humanize=True` | ⛔ **已废弃（反作弊风险，勿用于 BOSS）**：移入 `backends/_deprecated/`，`common.sh` 拒绝加载 | https://github.com/CloakHQ/cloakbrowser |\n| **agent-browser (Vercel)** | `agent_browser` | local | 开源 | 无障碍树 `@eX` 引用交互（轻量，非反检测路线） | ⚪ 文档候选（未实现；若实现须是受控运行时，禁扩展直驱） | https://github.com/vercel-labs/agent-browser |\n\n> 🔴 **R12 反作弊红线（硬性）**：BOSS 直聘禁止**任何 Agent** 的浏览器扩展直控（含 Codex `@Chrome` / CloakBrowser）。\n> 本 skill **统一 `brs` 单后端**（agent-brows"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"通用 BOSS 直聘求职 copilot：配合仿真人浏览器后端用真实光标安全检索/收藏岗位、读 JD、写破冰话术并按授权发送。强制走后端正门、真实光标、限速、撞墙停手、授权门控，绝不裸 CDP。四类资产（脚本/选择器/页面/点位）一律优先复用 skill 内置，禁止现写等价脚本或重猜选择器；新建前必查 script_catalog.md + boss_selectors.md。 Skill: BOSS直聘仿人求职助手 Owner: huagavin Summary: 通用 BOSS 直聘求职 copilot：配合仿真人浏览器后端用真实光标安全检索/收藏岗位、读 JD、写破冰话术并按授权发送。强制走后端正门、真实光标、限速、撞墙停手、授权门控，绝不裸 CDP。四类资产（脚本/选择器/页面/点位）一律优先复用 skill 内置，禁止现写等价脚本或重猜选择器；新建前必查 script_catalog.md + boss_selectors.md。 Tags: latest:0.1.0 Version history: v0.1.0 | 2026-08-09T13:57:24.485Z | auto boss-zhipin-copilot v0.1.0 - Initial public release of a configurable, open-source BOSS Zhipin job search c","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1230,"uniquenessScore":48,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T17:41:37.383Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T17:41:37.383Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T23:25:09.938Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}