feat(asr-pipeline): merge PR #1 webauth/CSRF/locking hardening and web_password fallback
Build image / build (push) Canceled after 0s
Build ASR Pipeline / image (push) Canceled after 0s

This commit is contained in:
Codex
2026-11-02 06:37:33 -08:00
parent 9debd1c47d
commit 3c70861463
44 changed files with 4354 additions and 333 deletions
@@ -0,0 +1,80 @@
# 当前流程与独立项目交接
核对日期:2026-11-02,Asia/Shanghai。
## 已验证
原代码:`/home/claw/claude-workspace/OBSIDIAN/asr-pipeline`。
原音频编排:`/home/claw/claude-workspace/OBSIDIAN/recordings/bin`。
原通知脚本:`/home/claw/claude-workspace/OBSIDIAN/bin/meeting-status-notify.py`。
本机 systemd:
| 单元 | 本次状态 | 职责 |
|---|---|---|
| asr-review-web.service | running | 8765 常驻上传、最近任务、审核界面 |
| obsidian-recording-watch.service | running | 监听录音并请求外部 ASR |
| obsidian-asr-refine.path | waiting | 监听 vault/.asr-inbox |
| obsidian-asr-refine-native.service | inactive | 按需整理转写,当前未运行 |
| asr-review-revise@.service | 模板 | 人工确认后生成/发布 |
`GET http://127.0.0.1:8765/health` 返回 `ok=true, pending=3`。
这说明审核队列存在待确认项,不证明三个录音都在推理,也不证明通知正常。
本轮不导出待确认正文,不生成新稿、不注册声纹、不写 vault。
## 代码确认的链路
- 监听单元显式选择 `MEETING_ASR_BACKEND=qwen3cam`。
- 对应脚本默认请求 `http://192.168.50.100:10099/asr`,整文件上传,
`language=Chinese`、`save_voiceprint_session=true`;服务内部切片。
本轮未对 GPU 服务发起真实录音测试,不据此宣称其健康或当前镜像版本。
- 原始转写保留声纹 session 与 speaker;归档后桥接到 vault/.asr-inbox。
- 独立 Python 管线包含模糊音/别名、关系与近期权重、数字归一、纯清洗与纠错分阶段。
- 初稿和中间状态在程序私有目录,正式纪要等待 Web 审核通过。
- 人物/公司卡提议与声纹确认存在代码路径;不等于当前外部注册服务验证通过。
## 运行数据边界
- `asr-pipeline/state/lexicon.db`:人工确认、关系、纠错、审核队列,不能重建后替代。
- `asr-pipeline/state/intake.db`:上传任务与状态。
- `state/drafts/`、`state/published/`:私有稿与发布回执。
- `recordings/{inbox,processing,processed,failed,transcripts,state}`:音频及编排状态。
- `vault/.asr-inbox/.state`:整理处理标记,切换漏迁可能造成重复处理。
- `.asr-refine.env`:私有凭据,未读取值、未复制、未入 Git。
本次只提取源代码、专业词库、现有测试、文档、unit 快照。没有复制生产音频、
个人 SQLite、缓存、会话、凭据或 `.venv`。历史设计文档有过时路径和模型,保留作来源。
## 已发现的风险(尚未改生产)
1. 通知脚本默认 `127.0.0.1:8644` 和 `~/.hermes/webhook_subscriptions.json`。
结合 Hermes 已迁走的资产记录,这是通知失效风险;本次未验证远端 webhook。
2. 本仓库代码的模型缺省已是 LiteLLM(清洗 `aistudio/gemini-flash-lite-latest`,成稿 `codex/gpt-sol-latest`),不是 ZenMux,也不是 Sonnet 5。生产 unit 若仍加载旧 `.asr-refine.env`,以那个文件为准;本次未读取凭据,不把代码缺省当成现网正在用的路由。
3. 路径耦合旧工作目录;本项目配置根目录、通知器、监听数据库已可外置,
但声纹地址、审核 systemd 单元名等仍有历史耦合。`deploy/systemd/` 保持现网快照,没有改 ExecStart。
4. 历史 HANDOFF 中写的是一次性页面。代码里有两个常驻界面:旧 `asrpipe.control_web`(快照单元,默认 8765)和新 `asrservice.web`(compose,默认 8788)。旧文档不作现态。
5. 产物删除和在线编辑会拒绝允许根以外的路径。发布到 `minutes/`、`People/`、`Companies/` 仍没有对照 vault SOP 的不可绕过白名单。本轮不冒充已审计完成。
## 代码已修复、生产未切换
下面这些是仓库里的新行为。现网单元没有改,不能当成已经在 8765/8788 的生产进程上生效。
- 未设置 `ASR_WEB_PASSWORD` 时,两个浏览器界面都拒绝上传、审核和改配置。临时放开只认 `ASR_WEB_ALLOW_ANON=1`。
- 登录后的写操作校验 CSRF。设置页不回显内网地址和密钥片段。
- `asrservice.worker` 与 `recordings/bin/meeting-watch.py` 抢同一把 `consumer.lock`。
- `ASR_GIT_SYNC`、`ASR_NOTIFY` 缺省为关。
- 修订失败会保留队列标记并重试;重新精修失败不会先删掉已回答的审核记录。
- 时间在界面上按 Asia/Shanghai 显示。词库列表按页读取,不再一次只截断前 180 条却不说明总数。
## 后续安全切换
1. 先确定模型路由与通知适配器,检查 vault SOP 与正式输出路径。
2. 建独立 venv、冻结依赖,使用合成数据跑回归,再选真实录音单测。
3. 停接新上传,确认没有转写/整理/审核发布在运行,再停相关 user units。
4. 对 SQLite 使用 backup API 生成一致性备份,保留原件;迁移录音状态与 inbox 标记,
不能对运行中数据库只复制主文件。
5. 路径变更还涉及数据库内草稿/转写绝对路径;要审计和映射,不能仅改 unit。
6. 生成新 unit 并逐个启用,确认只存在一个消费者;保留旧代码和备份以便回滚。
7. 验证上传 → 转写 → 确认链接 → 审核 → 正式纪要 → Git 同步完整链路后再移除旧目录。
本轮未执行上述生产切换,不承诺已独立上线。