工作台(workspace)是一个属于你自己的本地文件夹,存放一次求职周期的全部备战材料。所有文件都是纯 Markdown:人能直接读写,skills 往里生成内容,任何按本契约实现的客户端直接解析渲染,实时提词工具按同一格式取数。官方产品 greenroom.ungetsu.net 是其中一个实现,本文件是任何人都可以照着做的公开契约。
设计原则:
git init 成私有仓库做版本管理。my-greenroom/ # 工作台根目录(名字随意,私有)
├── profile.md # 候选人档案:履历事实底座 + 敏感事实
├── resume.md # 简历(Markdown 转写):客户端「简历」页的排版来源
├── resume.pdf # 可选:简历 PDF 原件(服务直连模式下客户端可直接打开)
├── story-bank.md # 经历库:项目经历卡,按岗换包装
├── library/ # 资料:行业岗位通识、参考阅读(任意 Markdown,子目录名作分组)
│ └── 通用/ai-产品岗-通识.md
└── jobs/
└── <slug>/ # 一个岗位一个目录,slug 用小写连字符,如 acme-ai-pm
├── job.md # JD 原文 + 岗位元信息
├── intel.md # 情报:JD 拆解 / 公司 / 面试官 / 考题预测
├── script.md # 面试逐字稿(口语化、可朗读、客户端可解析)
└── rounds/
├── mock-1.md # 模拟面试记录(第 1 次)
├── r1-debrief.md # 第 1 轮真实面试复盘
├── r2-prep.md # 第 2 轮赛前备战稿(可选)
└── r2-debrief.md
最小可用工作台 = profile.md + jobs/<slug>/job.md,其余文件由各 skill 按需生成。
每个文件头部带 YAML frontmatter,工具靠 type 识别文件,不靠文件名猜:
---
type: profile | resume | story-bank | job | intel | script | debrief | mock | round-prep
job: <slug> # jobs/ 下的文件填所属岗位
round: 1 # debrief / mock / round-prep 填轮次
updated: 2026-06-10
---
自由 Markdown,建议包含:基本履历线(时间倒序)、教育背景、敏感事实区(职级、薪资、离职真实原因、竞业等——这些只进工作台,面试里怎么对外说在逐字稿里写定)、风格偏好(可选:一句话描述或说话样本路径,interview-script 按它调整表达)。
简历的 Markdown 转写,客户端「简历」页据此排版(# 姓名 → 抬头;紧随其后的段落 → 联系方式行;## → 分区;### 公司|岗位|日期 → 条目,末段日期自动右对齐)。事实以 PDF 原件为准,改简历先改 PDF 再同步这里;greenroom 入口 skill 在初始化时自动完成转写。resume.pdf 可选地放在工作台根目录(或用 symlink 指向原件),服务直连模式下「简历」页提供原件打开入口。
简历页同时承担「简历制作台」职责:resume.md 是候选人事实源,客户端可以从它导出 resume.json(JSON Resume 兼容结构)和 rendercv.yaml(RenderCV 兼容草稿),用于后续接入高质量 PDF 渲染、版本化简历、按岗位改写和外部模板编辑。
开源适配边界:
任意 Markdown 文件即被客户端「资料」页收录:标题取 frontmatter title 或文内第一个 # 标题;一级子目录名作为分组。industry-brief skill 的行业岗位通识、范本拆解、长文摘记都放这里。
每个经历卡一个 ## 二级标题。卡内约定三块(外加一行可选的时间):
## 经历卡:<项目名>
**时间**:<机构/场景> · <起止,如 2024.05 – 2025.01,或 2026.04 – 至今>
**事实底座**(数字必须带出处)
| 事实 | 数字/结论 | 出处 |
|------|-----------|------|
| 收入增量 | +8% | 2025 Q3 复盘报告 |
**一句话版**:一句能在自我介绍里带过的说法。
**按岗包装**
| 岗位类型 | 讲什么角度 | 别讲什么 |
|----------|-----------|----------|
| AI 产品 | 模型怎么选型、效果怎么验证 | 内部组织细节 |
**可被追问点**:列出面试官会往下挖的 2-4 个点和应对要点。
同一批项目对不同岗位换包装是经历库的核心:底座事实只有一份,角度随岗位变。
**时间** 行可选:填了客户端就在卡片标题下显示「机构 · 期间」时间锚,并解锁卡墙的「按时间」排序(最新在前,至今/现在 视为最新);不填则不显示、不影响其他卡。期间应与简历一致。资料页(library/)的时间同理由 frontmatter updated: 驱动:有日期的资料卡显示相对新鲜度(如「3 天前」,超半年标红),并在分组内按新到旧排序——无日期的参考资料不受影响。updated: 缺省时回退解析文件名里的日期(…_2026.06.10.md / …-2026-06.md 等,要求 20xx 年份前缀以免误命中版本号),所以按日期命名的情报文件即便没写 frontmatter 也能显示新鲜度。
---
type: job
company: 星澜科技
role: AI 产品经理(Agent 方向)
status: interviewing # tracking | applied | interviewing | offer | closed
source: 猎头张三 / 官网
domain: example.com # 可选:公司官网域名,客户端用它取公司 logo(Google favicon 服务,零配置)
logo: https://…/logo.png # 可选:自定义 logo 图片 URL,优先于 domain;想要高清可填 logo.dev / Brandfetch 链接
updated: 2026-06-10
---
正文:JD 原文(保留原话,拆解放 intel.md)。可选「## 时间线」区块记录岗位进程,每行 - YYYY.MM.DD 事件(投递 / 一面 / offer…)——客户端在岗位页渲染成事件流、总览卡显示最新一条;/api/setup 建档时写入首条,后续轮次由 debrief 回写或手动补。两个 logo 字段都不填则显示公司名首字母章;注意 domain: 模式会向 Google 的 favicon 服务发起该域名的图片请求(不含任何个人数据,介意则留空或自备 logo: URL)。
自由 Markdown,建议结构(job-intel skill 的输出模板):JD 逐条匹配表(JD 要求 / 我的证据 / 匹配度 / 风险 / 策略)、公司与产品摘要、面试官档案(背景、风格、prefer 什么人、打法调整)、猎头口径 vs 实际岗位差异、下轮考题预测、渠道情报(面经等,带来源)。
---
type: script
job: acme-ai-pm
updated: 2026-06-10
---
# 星澜科技 AI 产品经理 · 面试逐字稿
## 一、开场
### 题 1. 自我介绍 [每轮开场必问]
> 速查:现职定位 → 上份战绩 → 早年底色 → 收口到岗位
**逐字稿(约 2 分钟)**
正文第一段,口语、可直接朗读。
正文第二段。分点时用 **一、** **二、** 加粗序号开头。
**口径**
- 收入数字统一 +8%,出处=2025 Q3 复盘报告
解析规则(客户端与打包工具均按此实现):
| 元素 | 规则 |
|---|---|
| 模块 | ## 开头 + 中文序号:^#{1,2}\s+([一二三四五六七八九十]+)、\s*(.*)$ |
| 题目 | ### 题 N. 标题 [标签]:^#{2,3}\s+(?:题\s*)?(\d+)\.\s*(.*)$,标题尾 [...] 为「谁高频问」标签 |
| 速查引语 | 题目后的 > 引用块,作为速查页的要点提纲 |
| 体例行 | **逐字稿(约X分钟)**,其后段落进入正文;兼容 重铸逐字稿 / 快版 / 完整版 变体,一题多个体例行时后续版本并入正文 |
| 口径区 | **口径** / **提示** / **改了什么** / **⚠️ 口径红线** 起,到题尾,渲染为折叠区;标记行允许冒号后直接跟内容(**提示**:内容) |
逐字稿写作标准(防 AI 腔、口语姿态)见 skills/interview-script/references/style-zh.md,这里只管结构。
建议结构(debrief skill 输出模板):问答复原(尽力还原,不确定处标注)、面试官情报更新、下轮预测与待办。
mock-interview skill 输出:逐题问答记录 + 评分(结构 / 证据密度 / 数字有无出处 / 时长 / 背诵感)+ 修订建议。
type: round-prep。某一轮面试前的作战稿——方案要点、叙事调整、反问设计、可直接念的口语段。客户端在「轮次记录」里渲染成「备战」卡(与「真实复盘」用不同色区分),按 round 排在同轮复盘之前。
客户端对岗位目录里任何它不认识的
.md都会兜底渲染成「材料」卡,绝不静默丢弃——放进jobs/<slug>/的文件不会凭空消失。round-prep只是其中一类被赋予了专门的「备战」样式。
客户端直连(免选文件夹):本地服务暴露两个只读端点,客户端启动时自动探测(先同源,再 localStorage 里记住的后端,最后 http://127.0.0.1:8765):
GET /workspace/bundle → {root, files: {相对路径: md 全文}, assets: [pdf 等二进制相对路径]},每次请求实时读盘GET /workspace/file?path=<相对路径> → 单文件原始字节(带 MIME),用于 pdf 原件等仓库自带 serve.py(python3 serve.py ~/my-greenroom)实现了这两个端点,可以直接拿来当参考实现;自建提词后端按同样契约实现即可,一个端口同时提供工作台取数与提词接口。没有服务时客户端可以降级为拖拽 / 目录选择 / IndexedDB 句柄重连,解析仍全部在浏览器本地。
实时提词工具按以下方式从工作台组装上下文,细节见 docs/realtime-bridge.md:
工作台目录永远不要放进公开仓库。本仓库只含 skills、岗位知识库、契约文档、参考后端和虚构示例(examples/demo-workspace/),不含任何真实个人数据。