dsh-job-ledger
Manifest valid★ 1Local-first job application ledger for DeepSeek Harness: dedupe, state machine, and reconciliation against BOSS Zhipin. Records what you applied to; you decide what goes out.
dsh-job-ledger
DeepSeek Harness 的求职投递账本:判重、冷却、证据链、与平台对账。 它记录你投过什么、投成了什么;投不投由你决定。
状态:代码完成 7 个里程碑,真机未验证。 PRD v0.8(39 项决策)· 技术设计 v0.1 接口结构与页面选择器按设计实现,但还没有对着真实账号跑过——见下方「未验证」。
它解决什么问题
自动投递工具已经很多,但没有一个解决真正的问题:
| 失效模式 | 表现 |
|---|---|
| 无记忆 | 今天投过的明天还投;同一岗位多个 HR 发还投 |
| 数据不在你手里 | 服务关停,投递队列和历史一起消失 |
| 双真源缝隙 | 投递器和账本各记一套,重复发生在两者之间 |
| 无法对账 | 账本说投了,平台说没投,没人发现 |
本项目的切入点不是"投得更快",是"投得清楚":账本能和 BOSS 自己的投递记录对账, 发现"投了但没记上"和"记了但没投成"。
安装
dsh plugin --profile web add dsh-job-ledger
插件拉起一个专用 Chrome profile,首次由你扫码登录;登录态保存在 dataDir/chrome-profile,之后不用再扫。
第一次跑时如果没登录,调用 job_ledger_login:它把登录页放到前台并等你扫描(默认 3 分钟),成功后自动继续;
cookie 过期就再扫一次。所有数据留在本机。
你能拿到什么
十个工具(模型侧):job_ledger_profile · job_ledger_login · job_ledger_resume ·
job_ledger_discover · job_ledger_queue · job_ledger_apply · job_ledger_record ·
job_ledger_reconcile · job_ledger_backfill · job_ledger_report。
apply 是唯一的投递入口,面板和工具都走它。
一个面板(四屏):待投(勾选 + 进度)· 概览(今日已投 / 剩余额度 / 不确定 / 差异 / 昨日回复)· 对账差异(双侧列表 + 重新对账)· 设置(目标岗位 / 城市 / 薪资下限,保存即写账本)。
一个 skill:job-ledger,把编排硬约束(先对账、清单确认、uncertain 必须人工)写进模型可读的正文。
设计要点
- 单一入口:面板按钮与模型工具都调同一个
startRun(),不存在两个投递器。 - 只监听不重放:所有数据来自页面自身发出的请求,不构造、不签名、不伪造请求头。
- 判重偏保守:确定重复 / 疑似 / 新岗位三级;同公司不同职位永远算新岗位;城市不同不判重。
uncertain是一等状态:点了但不确定成没成,就记为不确定,永不自动重试。- 账本只追加:
events.jsonl+fsync,重放遇坏行即停;账本是产品的价值本身。
数据与隐私
$DSH_HOME/job-ledger/ # 可配置 dataDir
├─ events.jsonl # 唯一真源,只追加
├─ evidence/<appId>.png # 投递证据截图(0600)
├─ chrome-profile/ # 专用浏览器登录态(含 cookie,0700)
└─ snapshot.md # 报表导出(可选)
简历默认脱敏后才交给模型(privacy.resumeExposure: redacted);确认原文需要显式改成 full。
不加密是明确取舍:一键装优先,备份与分享自行注意——这个目录等于你的简历。
未验证(诚实清单)
以下按设计实现、有测试,但没有对真实页面验证过(TECH §20):
- 简历三个接口的响应字段名;
- 点击「立即沟通」后实际发出的请求、简历是否为独立请求;
- 简历卡片在聊天流里的 DOM 结构;
- 岗位列表是否带 JD 文本、翻页参数;
geekDeliverList的分页与返回字段(目前只读第一页,并明确告知);- 业务码 9 / 31 / 32 / 36 / 37 的实际语义;
- 招呼语输入框是否可编辑;
- 面板的 slot / locale 注册形状(客户端包由宿主运行时提供,仓库里没有其类型)。
已验证(2026-11-03,Chrome 156,未登录):pnpm smoke:cdp 跑通了 Chrome 启动 → CDP 连接 → 导航 →
DOM 读取 → 截图 → 缺失选择器错误码 → 登录墙识别。未登录时 BOSS 会重定向到 /web/user/(不是设计里猜的
?login),重定向晚于框架提交,所以登录检查是轮询而不是单次。
改版只需要改 src/cdp/boss.ts 一个文件——所有选择器与接口 pattern 都集中在那里。
开发
pnpm install
pnpm check # 硬规则扫描 + 类型检查(host/client)+ 测试 + 构建
pnpm test # node --test,不需要测试框架
pnpm lint:rules # 七条硬规则:重放请求 / 合成点击 / 第二写者 / 原生依赖 …
pnpm smoke:cdp # 真实 Chrome:启动、CDP、导航、DOM、截图、登录墙(不需要账号)
- Node
^22.19 || >=24;测试直接跑 TypeScript。 lib/是构建产物,不入 git:index.js(host)与client.js(面板)。- 改面板后需要重建;要免刷新热更,得同时跑 DSH 仓库的
pnpm run dev:web(本仓库没有这个脚本)。
目录
docs/ PRD 与技术设计
src/ledger/ 事件日志、投影、状态机、租约、队列、报表
src/dedupe/ 归一化、指纹、SimHash、三级判定
src/cdp/ Chrome、CDP、响应捕获、平台适配、点击
src/discover/ 岗位列表解析与入账
src/resume/ 简历解析、脱敏、招呼语填槽
src/run/ 投递编排、判定、证据、熔断、配速
src/reconcile/ 对账与回填
src/api/ 面板 API(契约、视图、处理器、挂载)
src/client/ 面板 UI
assets/ skill 正文
scripts/ 硬规则扫描
许可
MIT
Comments
Loading…
From the same category
DeepSeek Harness plugin for Reactive Resume: bridges your resumes and job applications into a Harness session over MCP.
★ 41.7k
↓ 123/wk
MIT
Aug 24, 2026
dsh plugin --profile web add dsh-plugin-reactive-resumeby dsh-market
The plugin market inside DeepSeek Harness — browse, search, one-click install · DSH 可视化插件市场
★ 10.9k
↓ 325.7k/wk
MIT
TypeScript
Nov 4, 2026
dsh plugin --profile web add dshmarketby Tencent
Let AI agents use your real, logged-in browser without interrupting your work. CLI + extension for browser automation across any shell-capable AI agent.
★ 10.1k
↓ 14.6k/wk
MIT
TypeScript
Nov 5, 2026
dsh plugin --profile terminal add @wxg-prc-cpg/browser-skill-dsh-pluginby superdesigndev
OpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn
★ 7.2k
NOASSERTION
Python
Nov 5, 2026
dsh plugin --profile web add treg-dshby yjh051108
dsh-routing-suite — injector + router-standard kit: install the runtime injector first, then the task-aware reasoning-mode router preset (measured P1-P23).
★ 7k
MIT
JavaScript
Sep 18, 2026
dsh plugin --profile web add @dsh-external/dsh-super-injectorby Q00
Agent OS: the agent gets smarter on its own. We just hold the line: Interview-gated, staged evaluation, budgeted evolution loop. MCP server, 14 runtimes: Claude Code, Codex CLI, Gemini CLI, OpenCode,
★ 6.3k
MIT
Python
Nov 5, 2026