# 01 Resume

> SKILL · 简历整理（v0.1.0）

- Skill: `gilgameshcc/01-resume` (Agent Skill, multi-file: 6 files)
- Install (CLI): `npx skillmds@latest add gilgameshcc/01-resume`
- Raw SKILL.md: https://api.skillmd.com/api/skills/gilgameshcc/01-resume/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: gilgameshcc (https://skillmd.com/u/gilgameshcc)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/gilgameshcc/01-resume

---

# SKILL · 简历整理（v0.1.0）

**把本文件整份交给你的 agent 即可**——不依赖任何特定 agent 产品，不需要注册命令、不需要放在特定目录、不需要装任何东西。连同 [`facts.md`](../00-workspace/templates/facts.md) 一起贴给它，就能开始。

---

## 开跑前

### 要什么

| | 要什么 | 缺了会退化成什么 |
|---|---|---|
| **必需** | **`facts.md`**（事实池：经历条目 + 可复用指标 + 口径裁定记录，见 [`00-workspace`](../00-workspace/templates/facts.md)） | **拒绝生成，不编。** 没有它就没有"单一事实来源"这条纪律的锚点——先要你把经历材料整理成事实池，哪怕散着说的几段话也行，整理是 agent 的工作 |
| 可选 | **目标 JD** | 没有就退化成"维护现有版本"，明确告知产出"未针对具体岗位定制" |
| 可选 | [`jd-triage`](../03-company-analysis/jd-triage/README.md) 的定级结果 | **降级**匹配度自检前置——不是跳过，第一步仍然会做，只是从结构化定级降级成常识性粗判（城市/薪资区间是否明显不合），并提示这一步的判断质量打了折扣 |
| 可选 | 现有的三个版本文件（主版本 / 转型版 / 副线版，见下方版本登记表） | 没有就从 `facts.md` 现场生成"主版本"，作为后续所有定制的起点 |

### ⭐ 最小可接受形态

**一份 `facts.md`（哪怕只有两三段经历）+ 一句"我想投什么方向"。**

不需要三个版本都齐全，不需要 JD，不需要匹配度自检的输入——**这些没有都能跑，跑出来的是"未针对具体岗位定制的一份主版本"**，明确标注这一点，不假装它已经是投递就绪的成品。

#### 照最小形态给，你会拿到 X，但拿不到 Y

| ✅ X：你会拿到 | ❌ Y：你拿不到 |
|---|---|
| 一份从事实池摘录、按标准结构排好的简历 markdown | **针对具体岗位的定制**——没有 JD，四处白名单里的"术语替换成 JD 原词"与"按 JD 强调排序"两条无从执行 |
| 单页校验（工具或 no-code 路径任选一条） | **匹配度自检**——没有 `jd-triage` 的定级结果，判断不了这份材料值不值得投这个岗位，只能靠常识粗判 |
| 一句诚实的标注："这是未定制的主版本" | 一份"看起来已经准备好投递"的成品——**这正是这个模块要避免的错觉** |

### ⛔ 四条禁止（对 agent）

1. **不许报错退出。** `facts.md` 格式不规整、经历条目写得很随意，都不是异常，是常态——按能理解的部分先跑，理解不了的部分明确列出来问
2. **不许静默编造或润色。** `facts.md` 里没写的经历、没有的数字，**不许因为"读起来更完整"就补上**；"参与了"不许因为"听起来平淡"就改写成"主导了"
3. **不许一次只问一个问题挤牙膏。** 缺 JD、缺版本、缺匹配度输入——要什么一次列全，不要来回问
4. **不许把整理工作推给用户。** 用户口述的几段经历，由 agent 整理成结构化的 `facts.md` 草稿存回去；不合格的答复是"请先把经历整理成事实池格式再给我"

---

## 第一步 · 匹配度自检前置

**在动手定制之前，先判断这个岗位值不值得投。** 这一步的位置很关键——它排在"定制"之前，不是之后：先判断，再决定要不要投入定制的时间，而不是先做好一份简历再回头发现根本不该投。

- **有 [`jd-triage`](../03-company-analysis/jd-triage/README.md) 的定级结果时**：直接读它的级别。判「不投」的岗位，**本模块拒绝为它生成定制稿**——不是"生成一份但提醒你别投"，是**不生成**。这条纪律与"硬性排除条件不可被匹配度换"同源：给一份材料不该投的岗位定制简历，等于在鼓励"反正材料已经准备好了，要不还是投一下试试"这种回退。
- **没有定级结果时**：只做常识性粗判（城市/薪资区间是否明显不合、职责描述是否与事实池完全不搭边），拦不住的照常往下走，但要明确提示"这一步没有结构化定级支撑，判断质量打了折扣"。

⛔ **不许靠改简历硬凑匹配度。** 如果这份材料"不够贴合"，正确动作是"如实呈现 + 承认差距"或"判定不投"，**不是**在事实池里找一个能牵强附会上的条目硬塞进去。

---

## 第二步 · 版本选择：只维护三个，不许新建第四个

### 三个版本，各管一类岗位

| 版本 | 覆盖 | 典型场景 |
|---|---|---|
| **主版本** | 与过往经历直接相关的岗位 | 大多数投递会用这个 |
| **转型版** | 目标角色与过往经历有偏移，需要重新组织叙事重点的岗位 | 换赛道、换职能方向 |
| **副线版** | 依托一条与主线不同、但同样真实的经历线 | 比如主线是产品经理，副线是曾经做过的技术方向 |

用 [`templates/版本登记表.md`](templates/版本登记表.md) 追踪这三个版本各自的目标、最后更新时间、对应文件路径。

### ⭐ 为什么是三个、为什么不许加第四个

**版本数本身是一个需要控制的变量，不是越多越贴合越好。** 每多一个版本，意味着：

- 事实池更新时，需要同步检查的下游文件多一份——**这是事实口径漂移最常见的入口**：主版本改了一个表述，转型版没同步改，三个月后两份材料对同一段经历的说法对不上
- 多一个"哪个版本该用在这个岗位上"的判断负担

**遇到"三个版本都不太合适"时的正确动作**：从三个里选最接近的一个，**在第三步的白名单范围内做定制**，而不是新建第四个"专门给这类岗位用"的版本。如果连续多次都在同一类岗位上觉得"三个都不合适"，那是一个信号——**应该反过来去调整这三个版本的定位划分**（比如转型版的目标角色本身该往这类岗位偏移一点），而不是加版本数来适配。

⛔ **agent 不许自作主张新建第四个版本文件**，哪怕用户说"这个岗位有点特殊"。正确回应是提示上面这条纪律，并从三个里推荐一个起点。

---

## 第三步 · 定制：白名单四处，改别的都算违规

用 [`templates/简历骨架.md`](templates/简历骨架.md) 的结构，从选定的版本 + `facts.md` 出发，**只做这四件事**：

| # | 允许的动作 | 例 | ⛔ 不许做的相邻动作 |
|---|---|---|---|
| 1 | **优势条目顺序** | JD 强调"跨团队协调"，把对应的优势条目挪到最前 | ⛔ 不许改写优势条目的措辞让它"看起来更贴合" |
| 2 | **术语替换成 JD 原词** | JD 写"智能体"，把简历里的"Agent"换成"智能体" | ⛔ 不许借着"替词"的名义悄悄夸大——把"参与"换成"负责"不是替词，是改事实 |
| 3 | **经历条目排序** | 把与 JD 更相关的经历段落往前排 | ⛔ 不许删掉一段经历里的某个不利细节（"不利"不构成删除理由，"与这个岗位无关"才构成） |
| 4 | **`[可选]` 条目增删** | `facts.md` 里标了 `[可选]` 的经历/项目，可以按相关性决定是否出现在这一版里 | ⛔ 不许增删任何**没有标 `[可选]`** 的条目——那些是必须出现的核心事实 |

⚠️ **#1 与 #2 在同一处文本上重叠时，#2 优先，但范围严格收窄**：如果一条**优势条目**里恰好出现了待替换的术语（比如优势条目原文是"熟悉 Agent 相关开发"，JD 用词是"智能体"），允许换这一个词本身，**但不许借这次改动顺带调整句子结构、语气或强调重点**——换完只能是"熟悉智能体相关开发"，不能变成任何读起来"更贴合"的重写。分不清这处改动是"只换了词"还是"顺便润色了"，就按 #1 的禁止项处理，撤销这处改动。

⚠️ **`[可选]` 标记本身也受白名单约束，不是白名单管辖之外的自由地带**：`[可选]` 只能基于**"是否与目标岗位类型相关"**打标，⛔ **不许因为一段经历不利/不好看而标成 `[可选]`**——这是白名单第 3 条"不许因不利删除"这条纪律在更早一步（facts.md 整理阶段）的延伸，标记环节被绕过 ≈ 删除环节被绕过。标记这一步发生在 `facts.md` 阶段，判据见 [`00-workspace/templates/facts.md`](../00-workspace/templates/facts.md) 的对应说明；定制阶段引用某条 `[可选]` 标记时，如果你自己（或用户）说不清"这条为什么当初被标成可选"，视为标记本身可疑，先回去核实理由，不能直接当作合法的白名单第 4 条操作。

**明确不改的东西**：数字、事实、公司名、时间。**任何一处改动，要能说清它属于上面四条里的哪一条；说不清，就不许做。**

用 [`templates/定制白名单自查表.md`](templates/定制白名单自查表.md) 在定稿前把这次做的每一处改动过一遍——**这不是形式主义，是这个模块唯一的质量保证机制**：没有 evaluator、没有自动化检测能拦住"美化了一句话"，能拦住它的只有执行者自己在收尾前逐条核对。

### 定制阶段来源标注的特殊规则

见下方"来源标注"一节——**定制阶段只允许两档：`你给的`（来自 facts.md）和"这处改动属于白名单第几条"**。一旦出现任何"我推测的"内容，说明单一事实来源已经被破坏，**立即回滚这处改动**，不是"标注一下就放行"。

---

## 第四步 · 单页硬约束 + 视觉复核

**光验字数或行数不够，必须看渲染图。** 这条纪律专门为一类真实踩过的坑而立：文本量估算合格，但因为某个表格、某段过长的公司名、或字体渲染差异导致视觉上溢出到第二页——只看文本统计发现不了这类问题。

两条路径的具体步骤都收在 [`templates/单页校验checklist.md`](templates/单页校验checklist.md) 里，走完这一步照着它逐项过一遍。

### 路径一：工具校验（`tools/md2pdf`）

```
node tools/md2pdf/md2pdf.js <定制稿.md> <输出.pdf>
```

- 退出码 `0` = 单页通过；`1` = 溢出到多页（脚本会报出实际页数）；`2` = 环境问题（找不到 Chrome，或输入文件有误）
- 溢出时**回到第三步精简**——只能用白名单四条里"删条目 / 调顺序"这两条来减少内容，⛔ 不许靠缩小字号、压窄行距这类排版手段硬塞进一页（那会让简历难以阅读，牺牲的是可读性去换页数，本末倒置）
- 环境问题（退出码 `2`）**不是失败**，直接走路径二

### 路径二：no-code 校验法（与路径一效力相同，不是降级方案）

**没有 Chrome、不想装任何东西的人，走这条**：

1. **行数与字符密度估算**：单页 A4 在常规简历字号（约 10-11pt）下，通常能容纳约 45-55 行正文（含空行与分节间距）。数一下定制稿的总行数（含每条 bullet 单独算一行），**明显超出这个区间就大概率溢出**，先按第三步精简一轮再往下走
2. **浏览器打印预览人工确认**：把定制稿转成 Word / Google Docs / 任何文本编辑器能"打印预览"的格式（或者直接把内容贴进一个网页文本框用浏览器打印功能预览），用系统的打印预览功能看渲染后的分页——**这一步不可省**，第 1 步的估算只是筛掉明显超标的情况，真正的判定标准是这一步的肉眼确认
3. 把这次校验的结论（估算行数 + 打印预览确认单页/未单页）记进定制稿末尾的一行备注，供下次迭代时参考

⛔ **两条路径都必须做"确认单页"这一步，不许只做估算就当完成。** 估算是筛查，不是验收。

---

## 第五步 · 输出与台账登记

一次定制完成后：

1. 定制稿存为 markdown（文件名规则见 [`00-workspace` 工作区骨架](../00-workspace/templates/工作区骨架.md)）
2. 单页校验通过的 PDF（工具路径）或校验记录（no-code 路径）
3. 在 `ledger.md` 补一行：日期 · 公司 · 岗位 · **用的版本**（主版本 / 转型版 / 副线版）· 匹配度自检结论

⛔ **判定「不投」的也要留痕**——第一步如果判定不投，同样在 `ledger.md` 记一行（版本栏留空，状态写"未定制：匹配度不达标"），这类记录是后续校准匹配度阈值的样本，不能因为没生成简历就当作没发生过。

---

## 来源标注

本模块的来源标注比其他模块更简单，因为它只消费**一个**上游文件：

| 标注 | 什么时候用 |
|---|---|
| `你给的` | `facts.md` 里的一切——经历、数字、口径。**定制阶段涉及的每一条事实性内容都必须是这一档** |
| `JD 原词` | 术语替换动作里使用的、来自 JD 原文的词——这不是"你给的"也不是"我推测的"，是第三个特殊来源，仅限白名单第 2 条使用 |
| ⛔ `我推测的` | **定制阶段不允许出现这一档。** 一旦出现（比如"这段经历应该也涉及了跨团队协调"），说明正在编造或过度诠释，**立即回滚这处改动，不是标注后放行** |

> 这与其他模块的"三档"体系不同——`interview-strategic-assessment`、`jd-triage`、`05-offer` 里 `我推测的` 是合法的一档（只是不能单独触发不可逆动作）；本模块里它**从一开始就不合法**，因为本模块处理的是"关于你自己"的事实，没有"推测"的空间——你自己的经历不需要被推测，只需要被准确摘录。

---

## 不对劲的时候

`症状 → 最可能原因 → 你下一句该说什么`

| 症状 | 最可能原因 | 你下一句该说什么 |
|---|---|---|
| **定制稿里出现了 `facts.md` 里没有的经历或数字** | 单一事实来源被破坏——agent 在"让简历更贴合"的压力下编造或过度诠释了 | *"这条经历/数字不在事实池里，删掉；如果确实发生过但没记录，先补进 `facts.md`，走完确认流程再引用"* |
| **同一段经历在不同版本里的表述对不上** | 版本之间没有对齐到同一份 `facts.md`，或某个版本改的是产物而不是源头 | *"检查这段经历在 facts.md 里的原始表述，所有版本都必须能追回到同一处"* |
| **它想新建一个"专门给这类岗位用"的第四个版本** | 版本收敛纪律没被遵守 | *"从三个版本里选最接近的一个，在白名单范围内定制；如果这类岗位反复出现，我们回头调整三个版本本身的定位，不是加版本"* |
| **它说匹配度不够，但还是生成了一份定制稿** | 第一步的匹配度自检前置没有真正生效——判「不投」应该拒绝生成，不是生成后加一句提醒 | *"匹配度不达标的岗位不该有定制稿，重新走一遍第一步，判不投就到此为止，只在 ledger 里留一行"* |
| **单页校验只做了行数估算就说通过了** | no-code 路径的两步被当成了一步——估算只是筛查，不是验收 | *"这只是估算，还没做浏览器打印预览人工确认，那一步不能省"* |
| **`tools/md2pdf` 报错，它就停下来等你处理环境问题** | 没有意识到 no-code 路径是平级方案，不是工具失败后的补救 | *"工具路径走不通就直接切 no-code 路径，两条路效力相同，不用先修好环境"* |

---

## 三级自救阶梯

**不要一出问题就把活推回给人。**

| 级 | 什么时候到这一级 | 该做什么 | ⛔ 不该做什么 |
|---|---|---|---|
| **L1 有现成的，直接走** | `facts.md` 格式规整、JD 齐全、版本清楚该用哪个 | 按规则执行，不问 | 不为"确认一下用哪个版本"打断用户——三问表里已经给了判据 |
| **L2 没现成的，自己走通 + ⭐ 沉淀** | 用户口述的经历需要整理成 `facts.md`；三个版本都不太合适；`facts.md` 格式很随意 | 自己整理、自己按"最接近"原则选版本、自己把散乱格式理成结构化表；**走通之后写回去**——整理出的 `facts.md` 存回去，版本选择的判断记进 `版本登记表.md` | ⛔ 不把"这次绕过去了"只留在会话里；⛔ 不因为"三个都不太合适"就自作主张开第四个版本——这一条没有 L2 自主权，直接进 L3 问用户要不要调整版本划分本身 |
| **L3 实在不行，才回报人** | L2 也走不通；或触及只有用户本人知道的事实（这条经历的真实细节、这个数字的真实口径） | 输出**症状 + 已经试过什么 + 建议你做什么** | ⛔ 不输出裸错误；⛔ 不替用户编一个"看起来合理"的数字去填空 |

---

## 变更日志

### v0.1.0（首发）

确立匹配度自检前置于定制之前，判「不投」的岗位拒绝生成定制稿 · 版本收敛为三个（主版本 / 转型版 / 副线版）并写明"三个都不合适"时的正确动作是调整版本定位而非新建 · 定制白名单四处，逐条给出"允许的动作"与"不许做的相邻动作"对照 · 定制阶段来源标注收窄为两档（`你给的` / `JD 原词`），`我推测的` 从一开始就不合法 · 单页校验双路径（`tools/md2pdf` 工具路径 + no-code 路径），两条路径明确效力相同、都要求"确认单页"这一步不可省。

