greenroom

Greenroom 工作台数据契约(workspace spec)

工作台(workspace)是一个属于你自己的本地文件夹,存放一次求职周期的全部备战材料。所有文件都是纯 Markdown:人能直接读写,skills 往里生成内容,任何按本契约实现的客户端直接解析渲染,实时提词工具按同一格式取数。官方产品 greenroom.ungetsu.net 是其中一个实现,本文件是任何人都可以照着做的公开契约。

设计原则:

目录结构

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 按需生成。

通用 frontmatter

每个文件头部带 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
---

各文件契约

profile.md(候选人档案)

自由 Markdown,建议包含:基本履历线(时间倒序)、教育背景、敏感事实区(职级、薪资、离职真实原因、竞业等——这些只进工作台,面试里怎么对外说在逐字稿里写定)、风格偏好(可选:一句话描述或说话样本路径,interview-script 按它调整表达)。

resume.md(简历)

简历的 Markdown 转写,客户端「简历」页据此排版(# 姓名 → 抬头;紧随其后的段落 → 联系方式行;## → 分区;### 公司|岗位|日期 → 条目,末段日期自动右对齐)。事实以 PDF 原件为准,改简历先改 PDF 再同步这里;greenroom 入口 skill 在初始化时自动完成转写。resume.pdf 可选地放在工作台根目录(或用 symlink 指向原件),服务直连模式下「简历」页提供原件打开入口。

简历页同时承担「简历制作台」职责:resume.md 是候选人事实源,客户端可以从它导出 resume.json(JSON Resume 兼容结构)和 rendercv.yaml(RenderCV 兼容草稿),用于后续接入高质量 PDF 渲染、版本化简历、按岗位改写和外部模板编辑。

开源适配边界:

library/(资料)

任意 Markdown 文件即被客户端「资料」页收录:标题取 frontmatter title 或文内第一个 # 标题;一级子目录名作为分组。industry-brief skill 的行业岗位通识、范本拆解、长文摘记都放这里。

story-bank.md(经历库)

每个经历卡一个 ## 二级标题。卡内约定三块(外加一行可选的时间):

## 经历卡:<项目名>

**时间**<机构/场景> · <起止 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 也能显示新鲜度。

jobs//job.md(岗位)

---
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)。

jobs//intel.md(情报)

自由 Markdown,建议结构(job-intel skill 的输出模板):JD 逐条匹配表(JD 要求 / 我的证据 / 匹配度 / 风险 / 策略)、公司与产品摘要、面试官档案(背景、风格、prefer 什么人、打法调整)、猎头口径 vs 实际岗位差异下轮考题预测、渠道情报(面经等,带来源)。

jobs//script.md(逐字稿)⭐ 解析契约最严格

---
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,这里只管结构。

jobs//rounds/rN-debrief.md(面后复盘)

建议结构(debrief skill 输出模板):问答复原(尽力还原,不确定处标注)、面试官情报更新、下轮预测与待办。

jobs//rounds/mock-N.md(模拟面试)

mock-interview skill 输出:逐题问答记录 + 评分(结构 / 证据密度 / 数字有无出处 / 时长 / 背诵感)+ 修订建议。

jobs//rounds/rN-prep.md(赛前备战,可选)

type: round-prep。某一轮面试前的作战稿——方案要点、叙事调整、反问设计、可直接念的口语段。客户端在「轮次记录」里渲染成「备战」卡(与「真实复盘」用不同色区分),按 round 排在同轮复盘之前。

客户端对岗位目录里任何它不认识的 .md 都会兜底渲染成「材料」卡,绝不静默丢弃——放进 jobs/<slug>/ 的文件不会凭空消失。round-prep 只是其中一类被赋予了专门的「备战」样式。

工具取数约定

客户端直连(免选文件夹):本地服务暴露两个只读端点,客户端启动时自动探测(先同源,再 localStorage 里记住的后端,最后 http://127.0.0.1:8765):

仓库自带 serve.pypython3 serve.py ~/my-greenroom)实现了这两个端点,可以直接拿来当参考实现;自建提词后端按同样契约实现即可,一个端口同时提供工作台取数与提词接口。没有服务时客户端可以降级为拖拽 / 目录选择 / IndexedDB 句柄重连,解析仍全部在浏览器本地。

实时提词工具按以下方式从工作台组装上下文,细节见 docs/realtime-bridge.md

  1. 知识库 = jobs//script.md 全文(逐字稿里每个数字已写定口径与出处)
  2. 可选第二段 = jobs//intel.md(面试官信息与考题预测)
  3. 注入 system prompt:输出规则在前,逐字稿在后(取材库);要求只用稿里出现过的数字,没有就提示别编

隐私约定

工作台目录永远不要放进公开仓库。本仓库只含 skills、岗位知识库、契约文档、参考后端和虚构示例(examples/demo-workspace/),不含任何真实个人数据。