# 00 Workspace

> 建一个 agent 能接手的求职工作区

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

---

# 建一个 agent 能接手的求职工作区

> **把本文件整份交给你的 agent 即可**（复制粘贴进对话，或让它读这个文件）。不依赖任何特定 agent 产品的专有机制——`SKILL.md` 只是文件名约定，不是某一家的格式。你的 agent 只要能读写本地文件就够了。

**这份 skill 干什么**：陪你把手上散着的求职材料，落成一个结构固定的工作区——从此每次开新会话不用重讲背景，agent 读文件就知道你是谁、在找什么、上次到哪了。

**跑完你会拿到**：一个目录骨架 + 5 份填好开头的契约文件 + 一份写给 agent 的硬约束说明。**大约一次对话的时间。**

---

## 开跑前

| 要什么 | 必需 / 可选 | 缺了会退化成什么 | ⭐ 最小可接受形态（最少给到什么程度就能开始） |
|---|---|---|---|
| **一个放工作区的空文件夹** | 必需 | 这是唯一真必需的东西 | 一个路径，新建的空文件夹就行 |
| **你对「在找什么」的想法** | 必需（但可以很粗糙） | 骨架照建，但 `positioning.md` 的两栏留空，最后给你一张「就差这两栏」的清单。⭐ **下游定级模块读到空的必要条件时不猜、也不用默认值**——它会先要你把这两栏各写 2-3 条；如果硬跑，**所有岗位都会被判成"较匹配"**（没有一条能否决的条件，也就没有区分力） | **两条必要条件 + 两条硬性排除条件**，口语化就行（"必须能远程"、"不接受不写代码的岗"）。想不全没关系，先写想得到的 |
| **你的经历材料** | 必需（可以很乱） | `facts.md` 留空，下游简历模块会**拒绝生成内容**——它宁可停下来要材料也不编 | **散着贴**：旧简历、项目笔记、随手写的几段话，任何格式。整理是 agent 的活，不是你的 |
| **已经发生过的接触记录** | 可选 | `ledger.md` 只有表头，`06-positioning` 的漏斗分析没有数据；它会明说"这个量级看不出漏斗形态"，而不是硬给结论 | **〔10-20〕 条**（`默认建议值`）「公司 / 岗位 / 日期 / 对方回了什么」，散着贴也行。少于这个量级就先跳过，以后边跑边补。⭐ **但只给这四栏是有代价的，而且代价不可回收**——见下方「四字段够起步，不够收尾」 |
| **你正在犹豫的新方向** | 可选 | `branches.md` 空着。不影响主线，只是"投着投着发现新可能性"这条线暂时没有落点。⚠️ **但要注意另一半**：定级模块读不到活跃分支时一律按主线阈值判，**探路方向的岗位会被判成"不投"**——这不是 bug，是缺省的保守行为，你在试新方向就得手工告诉它 | 一句话描述 + 一句"看到什么我就放弃这个方向" |
| **你的偏好与红线**（通勤、汇报线、行业黑名单） | 可选 | 会被当成加分条件而不是排除条件，于是**匹配度高的岗位会把它换掉** | 想到几条写几条，重点是分清"不满足就不去"和"满足更好" |

### ⭐ 四字段够起步，不够收尾（`ledger.md` 少的那三栏）

台账的最小四字段「公司 / 岗位 / 日期 / 对方回了什么」够把台账**建起来**，但不够让下游**产出任何一个决策**。差的是三栏：**渠道**、**用的哪一版**、**级别**。

| 照最小形态给 → 你会拿到 | 补上这三栏 → 你才拿得到 |
|---|---|
| 漏斗的**形状**：接触了多少、回了多少、卡在哪一层 | **「哪个渠道有用」** —— 「不同渠道的回复率差异通常大于你对材料做的任何改动」（`默认建议值`，**一条未被验证的经验断言**，见下）（缺「渠道」栏 → 永久不可判） |
| "整体回应偏少"这类总体印象 | **「要不要改表述」** —— 改完到底有没有变好，只能靠版本与结果的对应关系（缺「用的哪一版」栏 → 永久不可判） |
| 每条卡了多久、哪些该跟进 | **「我的定级规则准不准」** —— 若高级别和低级别的回复率没差别，说明定级没有区分力；这是定级规则**唯一**的自检方式（缺「级别」栏 → 永久不可判） |

⚠️ **关键在于：这三栏是"以后补不回来"的。**

前面四栏（公司 / 岗位 / 日期 / 对方原话）事后大多还能从聊天记录、邮件里翻出来；**渠道、用的哪一版、级别翻不出来**——一个月后你不会记得某条是从哪个入口发出去的、用的哪一版材料、当时判的是几级。右列那三类决策之所以不可判，**不是数据量不够，是字段就没记**，而且时间一过就永久缺失。

所以：**值得一开始就记。** 三栏加起来一行不到十个字，换的是右列三类决策从"永远不可判"变成"可判"。

#### ⚠️ 「渠道差异大于材料优化」是一条 `默认建议值`，不是事实

> **「不同渠道的回复率差异，通常大于你对材料做的任何优化」——这句话在本仓库里承重**（它是"先看渠道、再改表述"这个决策顺序的全部依据），**但它是一条未被验证的经验断言，不是实测结论。** 来源等级：`默认建议值`。

**如果它在你身上不成立**（比如你只用一个渠道，或者你的材料本身有硬伤），照它走的代价是：你会先去折腾渠道，**拖慢真正该做的那件事——修表述**。所以它值得你自己验一次：台账攒够之后，先看分渠道回应率的差有多大，再决定信不信它。

⭐ **顺带一条通用纪律**：**判断性断言也要标来源等级，不只是数字。** 这句话躲过了"所有阈值都要标等级"那条规则整整一版——**因为它不长得像一个数字**。凡是被拿来支撑一个决策顺序、一次取舍、一个"通常"的说法，都按阈值同等对待。

⛔ **agent 不许因为用户这次没提供，就把这三栏从表里删掉。** 留着空栏，它会提醒人去填；删掉之后，没有任何东西会提醒人。

### ⛔ 这一段的四条禁止（对 agent）

1. **不许报错退出。** 上面任何一栏缺失，都继续把能建的建完，最后统一说明缺哪几项、因此哪个结论不可信
2. **不许静默自己编。** 缺的东西要说出来。尤其**不许替用户填 `positioning.md` 的必要条件与排除条件**——那是全仓唯一一处"必须本人回答"的地方
3. **不许一次只问一个问题挤牙膏。** 要什么**一次列全**（照着上表一次问完），拿到什么算什么，缺的最后一起说
4. **不许把该自己解决的整理工作推给用户。** 用户散着贴来的材料由你归位、去重、统一口径。"请先整理好再发给我"是被禁止的回复

---

## 流程

### 步骤 1 · 一次问全

按「开跑前」表**一次性**把六项列给用户，说明哪些必需、哪些可选、每项最少给到什么程度。让他挑着答。

**不要**逐项确认，**不要**在拿到第一项后就开始建目录。用户一次性倒完，你一次性接住。

### 步骤 2 · 建骨架

按 [`templates/工作区骨架.md`](templates/工作区骨架.md) 建目录和空文件。规则：

- **先建全，再填。** 空文件也建出来——一个存在的空文件会提醒人去填，一个不存在的文件不会
- **命名规则当场立下**：日期一律 `YYYY-MM-DD`；公司名用一个短名并**全工作区统一**（同一家公司在台账里两种写法，等于两家公司）
- 骨架建完先告诉用户**它长什么样**，再往里填内容
- ⭐ **`jobs/`（岗位原文）与 `triage/`（定级结果）是分开的两个目录**，一批的两半用同一个日期命名。判断不写回原文文件——写回去等于用判断覆盖了原始信号
- ⭐ **`runs/` 和 `resumes/` 建好骨架后一开始也是空的**——`02-apply`（写 `runs/`）与 `01-resume`（写 `resumes/`）都已随本次一起首发，但这两个模块都要你先跑起来才会往里写东西，建完工作区骨架的那一刻它们仍然是空目录。主动说明这一点，不说的话用户会以为自己漏做了什么，回头找一个其实是"还没触发"而不是"缺失"的东西

### 步骤 3 · 写 `AGENTS.md`

把 [`templates/AGENTS.md`](templates/AGENTS.md) 复制进工作区根目录，按用户的实际情况补两处：他手上有哪些 agent（浏览器侧 / 本地）、有没有暂时用不上的角色。

**可移植性**：如果用户的 agent 读的是别的文件名（`CLAUDE.md`、`AGENT.md`、或别的约定），**把这份改个名即可**，内容一个字都不用动。如果他的 agent 两个文件都不自动读，就在每次开工时把它粘进对话——效果一样，只是多一步。

### 步骤 4 · 填 `positioning.md` 的两栏

只填**必要条件**和**硬性排除条件**，各 2-3 条。其余栏位留空。

⚠️ **这一步必须用户本人回答，你不能代填、也不能"根据他的经历推断"。** 你推断出来的定位会让下游所有结论建立在一个他没同意过的前提上——而且他很难发现，因为你写得很像他会说的话。

你**该**做的是追问到可判定：用户说"想去有技术含量的公司"，追问"具体到看什么就能判断有没有技术含量？"——一条判据必须能在看 JD 或面试时给出是/否，否则它是愿望不是条件。

⚠️ **必要条件与加分条件不可互换。加分项再多也换不掉一条必要条件。** 这是全仓复现率最高的一类错误，后面还会在定级和 offer 排序时各犯一次。

### 步骤 5 · 把材料倒进 `facts.md`

用户散着贴，你负责归位：按时间倒序排经历条目，抽出可复用的指标，把同一件事的不同说法合并并记下**口径裁定**（对外统一怎么说）。

三条硬纪律：

- **不新增事实。** 用户没说过的，一个字都不许加，包括"顺理成章"的补全
- **不美化。** "负责了一部分" 不许写成 "主导"
- **记不清的数字进「待核实」区，不进正文。** 待核实区里的东西下游一律不许用；用户回头确认了再挪进正文

### 步骤 6 · 补登台账

有历史接触记录就补登进 `ledger.md`。**「对方回应原话」这一栏要原话，不要压成分类标签**——一旦压成"婉拒 / 待定 / 邀约"，就再也分不出"薪资不匹配"和"方向不匹配"了，而这两者指向完全不同的改法。

⭐ **补登历史记录时，原话实在找不回来的那几行标 `无法追溯`，⛔ 不许猜一句填进去** —— 与「渠道 / 用的哪一版 / 级别」三栏同一条口径（见「不对劲的时候」那一行）。猜出来的原话污染的正是这一栏唯一的用途：**它是下游分辨"拒的是讲法"还是"拒的是类目"的唯一依据**，猜一句进去比空着更糟。

顺手打上**反向吸引标记**：对方主动来找你的那些。这一栏最容易漏，而它往往指向你自己没意识到的定位。

⭐ **「渠道」「用的哪一版」「级别」三栏能补多少补多少，补不了也把空栏留着。** 它们是台账里唯一**事后补不回来**的三栏（理由见「开跑前」那一节），而且缺任一栏就有一整类决策永久不可判。用户只给了四字段时，明确告诉他这件事——**不要默默地把表压缩成四栏**。

### 步骤 7 · 建两本登记簿

`discoveries.md` 和 `branches.md` 建出来，通常是空的，这是正常的。

⭐ **这两份的模板本体不在本模块，在 [`../06-positioning/templates/discoveries.md`](../06-positioning/templates/discoveries.md) 与 [`../06-positioning/templates/branches.md`](../06-positioning/templates/branches.md)。** 它们是发散环的产出物，字段与计数口径跟着那个模块走；**本模块只负责把它们复制到工作区根目录，不另存一份副本**——曾经存过，两份就沿相反方向漂移了。

`discoveries.md` **登记零门槛**——看到任何"不在预期内"的信号就记一条，不要等它"够重要"。它和台账的区别是：台账记发生了什么，登记簿记**你没预料到的那部分**。
⚠️ 复制过去之后**不要改它的表头**：「出处」和「累计**独立事件**数」两栏看起来可省，但它们是"同一场面试的 4 条溢出算 1 次还是 4 次"这件事的唯一判定依据（口径见 06 的模板正文）。

### 步骤 8 · 自检并交付

逐条核对，然后一次性汇报：

- [ ] 5 份契约文件都存在（哪怕是空的）
- [ ] `AGENTS.md` 里四条硬约束逐条在（单一事实来源 / 优势区与经历区分工 / 分工表 / 升级路径）
- [ ] `positioning.md` 的必要条件与排除条件**由用户本人写的**，不是你推断的
- [ ] `facts.md` 里没有一条用户没说过的事实
- [ ] 台账的「对方回应原话」是原话
- [ ] 所有阈值处于留空状态并标了来源等级，**没有一个是你随手填的数字**
- [ ] 命名规则写进了 `AGENTS.md`，且现有文件都符合
- [ ] 目录建全了（含 `triage/`；`runs/` `resumes/` 空着是正常的，**已经把这一点告诉用户**）
- [ ] 台账里「渠道 / 用的哪一版 / 级别」三栏**存在**（哪怕全是空的），并已说明它们事后补不回来

最后告诉用户：**缺哪几项、因此哪些下游模块暂时用不了、以及各自最少补到什么程度就能用。**

⭐ **然后主动说一句下一步该去哪**，不要让用户自己回头翻根 `README.md` 的路由表——大多数人建完工作区后，下一步大概率是 [`01-resume`](../01-resume/)（整理简历）或 [`03-company-analysis/jd-triage`](../03-company-analysis/jd-triage/)（评估一条具体岗位）；如果用户已经有明确在看的岗位或已经约了面试，直接指向对应模块，不用绕回 01-resume。

---

## 来源标注

**你写进工作区的每一条结论，都要标出它是怎么来的。** 三档：

| 标注 | 什么时候用 | 示例 |
|---|---|---|
| `你给的` | 用户明确说过的 | 经历条目、必要条件、对方回复原话 |
| `公开可查` | 从公开渠道查到的，**附出处** | 岗位 JD 原文、公司公开介绍 |
| `我推测的` | 你根据已有信息推断的 | "你的排除条件里没提汇报线，但从你三次提到这件事看，它可能是一条必要条件" |

**⭐ 每一条 `我推测的` 后面必须附一句「要证实它，你该问谁 / 查什么」。** 一个没有验证路径的推测，和一个编造没有区别——用户没法处理它，只能选择信或不信。

示例写法：

> 你的目标形象可能更接近"偏业务的技术角色"而不是纯工程角色。`我推测的` —— 依据是你的经历条目里结果描述多为业务指标。**要证实它**：回头看你最近三次主动投的岗位，JD 里"业务"和"工程"的比重更偏哪边；或者直接问自己"如果一个岗完全不接触业务方，我还想去吗"。

在工作区里，标注写在条目末尾即可，不需要单独一栏。**唯独 `facts.md` 例外：那里只允许 `你给的`。** 出现任何 `我推测的`，说明单一事实来源已经被破了。

---

## 不对劲的时候

| 症状 | 最可能的原因 | 你下一句该说什么（直接说出口） |
|---|---|---|
| **agent 每次开工还是要你重讲背景** | 它没有真的去读工作区文件，只是在用对话里的上下文；或者 `AGENTS.md` 放的位置它不会自动读 | "开工前先读一遍 `AGENTS.md`、`positioning.md`、`ledger.md` 最近 10 条，读完用一句话复述我在找什么，再开始干活。" |
| **它给的建议听起来很对，但你想不起来自己说过这些** | 它在推测，而且没标出来 | "把刚才那段结论逐条标上 `你给的` / `公开可查` / `我推测的`；推测的那些，每条告诉我要证实它我该问谁、查什么。" |
| **简历版本里出现了你没干过的事，或者数字比你记得的好看** | 单一事实来源被破了：它在从上一版简历里读事实，而不是从 `facts.md` | "停。把这一版和 `facts.md` 逐条比对，列出所有在 `facts.md` 里找不到出处的表述。定制只能删不能改——数字、事实、组织名、时间一个都不许动。" |
| **所有岗位都被判成"还行、可以投"** | 硬性排除条件没写，或者写成了加分条件——于是匹配度高就能把它换掉 | "先把我的必要条件和硬性排除条件各写 3 条到 `positioning.md`，排除条件是**一票否决、不可被匹配度换**的那种。写完重跑一次定级。" |
| **一出小问题它就停下来问你** | 它把"规则能裁决的判断"也当成了要人拍板的事 | "按三级自救阶梯走：有规则就直接执行不用问；没规则就自己想办法走通，走通后把方法写回 `AGENTS.md`；真走不通再来找我，而且要带上症状、你试过什么、建议我做什么。" |
| ⭐ **想复盘"哪个渠道有用 / 要不要改表述 / 定级准不准"，却发现台账里没有这些栏** | 台账当初只记了四字段，「渠道 / 用的哪一版 / 级别」三栏没记——**这三栏事后补不回来**，所以这三类问题在已有数据上永久不可判 | "从今天起台账补齐『渠道 / 用的哪一版 / 级别』三栏，空栏也留着；已经发生的那些，能想起来多少填多少，想不起来的标『无法追溯』，别猜一个填进去。" |
| **工作区越来越乱，文件找不到** | 命名规则没立或没执行；或者新建了骨架之外的文件 | "把不符合命名规则的文件列出来（日期不是 `YYYY-MM-DD` 的、公司名写法不统一的、骨架之外新增的），逐个告诉我该并进哪个已有文件，别直接删。" |

---

## 三级自救阶梯

**什么时候才轮到"回来问人"。** 默认答案是：**不是现在。**

### L1 · 有现成的，直接走

模块里有明确规则、模板、或已沉淀的做法命中了——**按规则执行，不问。**

⛔ 不要为了"确认一下"打断用户。已有规则能裁决的业务判断，自己裁决；拿不准就按更保守的一侧走，事后记下理由。

### L2 · 没现成的，自己走通 **并把学到的写回去**

什么时候到这一级：规则没命中 / 上游文件缺失 / 用户给的输入不是预期格式 / 出现了模板没覆盖的情况。

**做法**：用语义理解自己找路。用户散着贴来的材料，你自己整理成契约文件；模板里没有的字段，你先按契约的最小字段凑齐；一种说法在两处不一致，你先按更保守的一侧统一并记下裁定。

**⭐ 走通之后必须写回去**：把这次的做法沉淀到该去的地方——归位规则写进 `AGENTS.md`，口径裁定写进 `facts.md` 的裁定记录，新的最小可接受形态写进工作区的开工说明。**目的是下次这件事直接回到 L1。**

⛔ **不许把"这次绕过去了"只留在会话里。** 没沉淀 = 下次还得再试一遍 = 等于没走通。

### L3 · 实在不行，才回报人

什么时候到这一级：L2 也走不通 / 触及 ⛔ 边界 / 需要只有用户本人才有的事实（他的必要条件、他记不记得那个数字、他愿不愿意为这个机会破一条底线）。

**回报必须包含三件事**：

1. **症状** —— 具体发生了什么，不是"出错了"
2. **已经试过什么** —— 你在 L2 尝试的路径和各自失败的原因
3. **建议你做什么** —— 给可选项，最好带一个默认推荐

⛔ 不输出裸错误。⛔ 不说"请提供更多信息"这种没有指向的话。⛔ 不把 L2 该自己解决的事推给用户。

---

## 变更日志

- **v0.1.3**（来自 [`fixtures/00-workspace/`](../../fixtures/00-workspace/expected.md) 首轮双向断言，**只改判据表述，不动结构**）：**步骤 6 补「对方回应原话」补不回来时的口径** —— 标 `无法追溯`，⛔ 不许猜一句填进去，与「渠道 / 用的哪一版 / 级别」三栏同构。原来那条口径**只写在那三栏上**，跑固件的 hit（整列被压成"婉拒 / 待定 / 邀约"）时，"该怎么补救"这一半只能靠类比借用。
- **v0.1.2**（来自一次**跨文件一致性审计**）：删掉 `templates/` 下 `discoveries.md` / `branches.md` 两份**已与 `06-positioning` 反向漂移**的副本，步骤 7 改为指向那边的模板本体（**模板全仓只留一份**）· 修正「缺 `positioning.md`」的退化说法 —— 按契约 §1 与 `jd-triage` 的口径是**不猜、不用默认值**，硬跑则**全部判成「较匹配」**（不是"按最保守一侧判、全部判不投"），并把误挂在这一行上的**缺 `branches.md`** 退化行为（探路岗位被判"不投"）拆回它自己那一行 · 给「渠道差异大于材料优化」这条**承重的经验断言**标上 `默认建议值`，并立一条通用纪律：**判断性断言也要标等级，不只是数字**。
- **v0.1.1**（来自一次端到端实跑测试）：「开跑前」补一节「四字段够起步，不够收尾」——说清照最小形态给会拿到 X、拿不到 Y，并点明 `ledger.md` 的「渠道 / 用的哪一版 / 级别」三栏**事后补不回来**；步骤 2 增加 `triage/`（定级结果的落点）与"`runs/` `resumes/` 现在注定是空的"的主动说明；步骤 6 与步骤 8 自检同步。
- **v0.1.0**（首发）：确立八步流程；「开跑前」六项输入与最小可接受形态；来源标注三档（`facts.md` 只允许 `你给的`）；「不对劲的时候」六条；三级自救阶梯。

