# sopc招聘台 Agent 维护入口

这份文档给以后通过 Codex / Agent 调整招聘台时使用。先读这里，再改文件。

## 线上位置

- 线上站点：`https://zp.sopc.club/`
- VPS 应用目录：`/opt/sopc-recruiting`
- VPS 数据库：`/var/lib/sopc-recruiting/sopc_recruiting.sqlite3`
- systemd 服务：`sopc-recruiting`
- nginx 站点：`/etc/nginx/sites-available/zp.sopc.club`
- 登录口令：由 `/etc/systemd/system/sopc-recruiting.service` 的 `SOPC_RECRUITING_PASSWORD` 控制

## 本地项目结构

- `server.py`：Python HTTP API，负责登录、候选人读取、HR 状态和面试评分写入 SQLite。
- `data/candidates.json`：候选人基础资料和初评数据源。
- `public/index.html`：前端页面、图表、筛选、候选人卡片、完整简历弹窗。
- `public/assets/docx/`：Word 截图候选人的原始简历图片。
- `public/assets/pdf/`：PDF 候选人的原始完整简历。
- `deploy/`：systemd / nginx 参考配置。

## 候选人数据字段

新增或修改候选人时，优先改 `data/candidates.json`。关键字段：

- `id`：稳定唯一 ID，英文小写短横线，不要改已有候选人的 ID，否则会丢关联的 HR 备注。
- `name`：候选人姓名。
- `gender`：页面显示的性别。明确资料才写 `男` / `女`；不明确写 `男（待确认）`、`女（待确认）` 或 `待确认`。
- `genderBasis`：说明性别来源，必须写清楚，例如 `PDF 明确标注：女` 或 `简历未写性别，按姓名暂判，面试需确认`。
- `intakeDate`：录入日期，格式 `YYYY-MM-DD`。用于区分哪天收进来的候选人。
- `intakeBatch`：录入批次，例如 `第一批 / BOSS+PDF+Word截图`、`第二批 / BOSS新增`。
- `source` / `sourceType`：资料来源。
- `salary` / `salaryBand` / `salaryScore`：薪资原文、薪资梯度、培养性价比分。
- `signals`：五大能力评分。
- `resumeAssets`：完整简历入口，PDF 用 `type: "pdf"`，Word 截图用 `type: "image"`。
- `avatar` / `avatarSource`：有可确认真人照片时必须优先使用真人头像。头像裁剪标准是圆形取图、脸部居中、不要露出源头像外圈的白色月牙；BOSS 性别小角标在边缘少量出现可以接受。确实没有可确认真人照片时，才留空并使用 Q 版占位头像。

五大能力字段：

- `agentCapability`：Agent 能力。OpenClaw、Codex、Claude Code、MCP、RAG、Harness、上下文工程都归这里。
- `visualCapability`：视觉能力。ComfyUI、Gemini 生图、文生图、图生视频、提示词、审美、视觉工作流都归这里。
- `automationIntegration`：自动化接入。RPA、爬虫、飞书/表格/API/Webhook/端口接入都归这里。
- `backendCapability`：后端技术。Python/Node/Java、服务端、数据库、部署、队列、缓存、稳定性都归这里。
- `opsCapability`：运营能力。跨境、电商、小红书、私域、客户交付、内容运营、平台运营经验都归这里。

## 增加候选人流程

1. 把原始简历放进对应目录：
   - PDF：`public/assets/pdf/`
   - Word/BOSS 截图：`public/assets/docx/`
2. 在 `data/candidates.json` 增加一个对象。
3. 必须填写 `intakeDate` 和 `intakeBatch`。
4. `resumeAssets` 必须指向完整资料，不能只放摘要。
5. 本地启动验证：

```bash
cd recruiting_eval_work/sopc_recruiting_workspace
SOPC_RECRUITING_PASSWORD=emem PORT=8788 python3 server.py
```

6. 打开 `http://127.0.0.1:8788/`，确认候选人出现、完整简历能打开、图表正常。
7. 部署前先备份 VPS 数据库，不要覆盖 `/var/lib/sopc-recruiting/`。

## 删除候选人建议

优先“隐藏/归档”，不要物理删除。原因：SQLite 里可能已有 HR 沟通记录和面试评分。

推荐做法：

- 在候选人对象加 `archived: true`。
- 前端如需隐藏归档候选人，再增加筛选逻辑。

只有确认不需要历史记录时，才删除 `data/candidates.json` 中对象，并同步清理 SQLite 的 `hr_notes`。

## 数据库注意事项

- `candidates` 表每次服务启动会根据 `data/candidates.json` 更新基础资料。
- `hr_notes` 表保存 HR 状态、面试时间、备注、老板分、技术分、沟通分等。
- 更新页面或候选人资料不会覆盖 HR 评分，除非改了候选人的 `id`。
- 部署前必须备份：

```bash
ssh my-vps 'cp -a /var/lib/sopc-recruiting /root/skywebssh-backups/sopc-recruiting-db-$(date +%Y%m%d_%H%M%S)'
```

## 部署命令参考

```bash
rsync -az --delete \
  --exclude '.deployed_password' \
  --exclude '.deployed_secret' \
  -e 'ssh -o BatchMode=yes -o ConnectTimeout=8' \
  recruiting_eval_work/sopc_recruiting_workspace/ \
  my-vps:/opt/sopc-recruiting/

ssh my-vps 'chown -R www-data:www-data /opt/sopc-recruiting /var/lib/sopc-recruiting && systemctl restart sopc-recruiting && systemctl is-active sopc-recruiting && nginx -t'
```

## 修改评分模型的原则

- 不要再拆很多小标签。页面一级分类只保留五大能力 + 低薪培养。
- 新工具名归类：
  - OpenClaw / Codex / Claude Code -> Agent 能力
  - Gemini / ComfyUI / Midjourney / SD / FLUX / 可灵 / 即梦 -> 视觉能力
  - RPA / 爬虫 / 飞书 / Webhook / API 接入 / 端口接入 -> 自动化接入
  - FastAPI / Spring / Node / Redis / Docker / 数据库 -> 后端技术
  - 小红书 / 跨境 / 电商 / 私域 / 客户交付 -> 运营能力

## 面试评分建议

面试后优先填写：

- `老板分`：老板主观判断，是否想带、是否合团队气质。
- `技术`：现场可跑能力、代码/项目真实性、排障思路。
- `沟通`：表达清楚、能追问、能复盘。
- `印象`：整体职业感和可信度。
- `潜力`：学习速度、AI-native 适应性。
- `共创匹配`：是否适合 SOPC 这种共创/交付/高审美团队。
- `风险可控`：薪资、到岗、包装、稳定性是否可控。高分代表风险更可控。

系统会自动合成 `面试分`，但最终以老板和专家团讨论结论为准。
