Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 53 additions & 17 deletions docs/maintainer/handoff-2026-09-16.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# Handoff —— 2026-09-16(自动合并通道、provenance 门禁、四个工作流立项与在途)
# Handoff —— 2026-09-16 → 09-17(六个工作流全部落地:门禁、自动合并、收养、命中率、报告卡口、结构化字段、企业部署)

> **更新于 2026-09-17 上午**:全部在途项已合并,0.5.4 已发布,生产端已做首次中文检索验证。§3 与 §7 已按最终状态改写;§8 是新增的生产验证记录。

> 面向下一个接手的人(或下一个 session)。本文件只写**当前事实 + 需要人决定的事**,不重复设计文档。
> 相关文档:`docs/maintainer/blueprint-and-strategy-review-2026-09-16.md`(战略审视)、
Expand Down Expand Up @@ -31,23 +33,27 @@

外部:`@misaka-net/misakanet-setup@0.5.3` 已发布;个人站点与 profile README 已更新(含新 blog《Five Failures That Passed Every Check》)。

## 3. 在途
## 3. 全部落地(原「在途」章节,09-17 收口)

七个工作流全部合并进 `main`(`main` = `8d362241a` 起),我方**无开放 PR**:

| 项 | 状态 |
|---|---|
| **#1786** `/adopt` fork 收养流程 | PR 开着,等 CI 绿合并(18 项测试;dry run 已对真实 PR #1656 跑通) |
| **#1787** 语音钩子 → 注意信号路由 + 桌面通知 | PR 开着,等 CI 绿合并(28 项测试;cue 只作查表键,命令全部是文件内字面量) |
| **#1788** 自动合并通道的 403 热修 | PR 开着(`gh api user` 用 App token 必然 403;已改常量 + `gh_read` 防御 + 作业级 `continue-on-error`) |
| **#1779** 命中率分母 | Agent 已完成,**待整合**:与 #1783 在 `workers/register-proxy-sw.js` 里交错 |
| **#1782** `--report --strict` 卡口 | Agent 已完成,**待整合**:与 #1783 在 `packages/misakanet-setup/bin/misakanet-setup.mjs`、`workers/misakanet-setup.test.mjs` 里交错 |
| **#1783** 结构化课程字段(`summary_plain`/`trigger`/`verify`) | Agent 仍在跑(最后一个) |
| **#1780** 接线近义词表 | 排队:等 #1779 合并(同文件另一区域) |
| **#1784** 企业部署 `--silent`/`--report-json` | 排队:等 #1782 合并(同文件) |
| 项 | 落地 | 关键点 |
|---|---|---|
| **#1779** 命中率分母 | 已合并 | 新 D1 表 `search_signals`(命中与未命中同一段代码、同一套字段);`GET /api/search-signals/stats` 只回 `solved`+`created_at`;`MISAKANET_SEARCH_SIGNALS=0` 可停 |
| **#1782** `--report --strict` 卡口 | 已合并 | 0/1/2 退出码;默认 `--report` 仍退 0(贴给人看的用法不被破坏);人手填的 `tools-visible`/`live-call-evidence` **永不**参与判定 |
| **#1783** 结构化课程字段 | 已合并 | `summary_plain`/`trigger`/`verify`(新增课程强制、存量劝告);对无字段的老课程响应**逐字节相同**(sha256 证明) |
| **#1784** 企业部署 | 已合并 | `--silent` + `--report-json`(同一数据模型两种编码)+ GPO/Intune/Jamf/Ansible + **数据边界**(明写托管端点无自托管形态,给出本地 stdio 替代与其代价);**0.5.4 已发布** |
| **#1778** fork `/adopt` | 已合并 | dry-run 默认、两段式评论、`Co-authored-by` 保 credit、`origin` 守护(拒绝把自己推进 fork) |
| **#1785** 语音 → 信号路由 | 已合并 | 一张 cue→动作表;命令全部是文件内字面量(cue 只作查表键);`MISAKANET_NOTIFY=0` 只关通知 |
| **#1780** 接线近义词表 | 已合并 | worker + 本地 CLI 同表同开关;统一旧 `_SYNONYM_MAP`(30 条迁移为 `related` 降级层);`INDEX_TEXT_VERSION` 保持 3(查询期展开,索引文本未变) |
| 门禁 / 自动合并通道 | 已合并 | #1768/#1771/#1773(含门禁自身 SSRF、令牌外泄、开放重定向的修复)+ #1781/#1788(403 热修) |

**整合方式已定**:#1783 落地后,把三者的改动**按 hunk 拆开**,各自开 PR、各自跑测试,不把三件事塞进一个 PR。
**整合方式(下次照做)**:并行 Agent 改同一文件后,用 `git apply` 按 hunk 过滤拆开(`/tmp/split_hunks.py` 的做法),各自开 PR、各自跑测试;第三个拆分用**独立 worktree** 而不是在主工作树里切分支。

## 4. ⚠️ 需要维护者(人)介入的事

> 09-17 更新:下面第 4 条(PAT)**不需要做**才能用 `/adopt`;`auto-merge-lesson` 标签**已创建**;第 1、2 条(首次 `/adopt`、首次自动合并)仍未发生,是整条机械通道唯一没跑过的环节。

1. **`/adopt` 的首次真实使用**:#1746–#1750 五个课程 PR 的内容是好的,只缺 DCO 签核(fork PR 的机器人推不动)。流程是:等 #1786 合并 → 在其中一个 PR 上评论 `/adopt`(看计划)→ 再评论 `/adopt --apply`。
**不要收养 #1656**:它是 519 字节骨架,课程本身过不了结构门禁,收养只会把一个本该被拒的 PR 合并进来。
2. **首个自动合并的端到端验证**:收养产生的新 PR 是同仓分支、签核齐备、只改 `lessons/`,**正好可以打上刚创建的 `auto-merge-lesson` 标签**,验证 #1781 的通道真的能自己合并。这也是目前唯一缺的"通道上线但没跑过"的一环。
Expand All @@ -72,9 +78,39 @@
4. **门禁必须被对抗性地读一遍**:provenance 门禁当天就被 open-code-review 找出三个安全洞;`too_large` 会跳过最大的文件(`workers/register-proxy-sw.js` 4475 行已切片补扫,结果在 issue #1775)。
5. **只在有证据时失败**:超时/DNS/限流/5xx 一律记 `unknown` 且不让构建变红——否则门禁一周内就会被绕过。

6. **共享工作树里不要用 `git checkout <ref> -- <file>` 去"取一份干净版本"**。我在拆分 PR 时对 `workers/register-proxy-sw.js` 这样做,把另一个 Agent **尚未提交**的改动从工作树里抹掉了(它自己又逐处重打了一遍)。已提交到分支的内容没丢(动手前先备份了完整文件与 patch),但这条动作在任何"多 Agent 共享 checkout"的场景里都是危险的:**要干净版本就用独立 worktree,或从 `git show <ref>:<path>` 取;永远不要就地覆盖别人正在改的文件。**
7. **"部署成功"≠"行为已生效"**。worker 的 `deploy-worker.yml` 报 success 只说明推上去了;真正的验收是在生产端点用真实查询验证(§8)。同理,"发布成功"的判据是发布任务日志里的打包版本,而且本机可达的镜像可能还在同步上一个版本。

## 7. 建议的下一步(按顺序)

1. 合并 #1786/#1787/#1788;#1783 落地后按 hunk 整合 #1779/#1782/#1783。
2. 启动 #1780(接线近义词表,统一 `misakanet/search/engine.py::_expand_query` 的旧 `_SYNONYM_MAP` 与 `data/query-aliases.json`)与 #1784(企业部署)。
3. 用 #1746–#1750 之一跑通"`/adopt` → 打标签 → 自动合并",把整条机械通道验成事实。
4. worker 部署后确认 `/api/search-signals/stats` 有数据;有分母之后再评估 B1。
1. **维护者两件事**(见 §4):用 `/adopt` 收养 #1746–#1750 之一并打 `auto-merge-lesson` 标签跑通机械通道;带 token 复验生产(§8 给了命令)。这两件做完,"课程生产线"才算**端到端**被验证过,而不只是各部分各自绿。
2. **等分母有数据**:`/api/search-signals/stats` 有了样本之后,才算得出命中率,也才能评估 #1767 里 P2 的 B1(首次报错自动触发)。在那之前做 B1 是无法评估的。
3. **#1780 的两个尾巴**:FAQ 匹配器是否跟随展开;`trigger` 是否并入 BM25 索引文本(并入需要 bump `INDEX_TEXT_VERSION` 并承担一次全量重建——要把这个代价和收益一起评估,别顺手做)。
4. **#1713–#1716 的处置**:改一行 provenance 即可合并;对方不响应时决定关闭还是补写。
5. **零散但值得**:`workers/register-proxy-sw.js`(4475 行)的 ocr 切片扫描结果在 issue #1775,其中 6 条已核实的严重项仍待认领(freshness 列表解析、heal.py 写原始日志、remote.py 路径拼接等)。

---

## 8. 生产验证记录(2026-09-17 上午,首次)

`#1794`(接线近义词表)合并后 worker 自动部署成功(deploy-worker run 143 @ `8d362241a`),随即在生产端点 `https://misakanet.org/mcp` 上验证:

| 查询 | 结果 | 读法 |
|---|---|---|
| `如何切换识图模型` | ✅ **2 条命中,top = 《多模型Switch脚本模式 — 双 Agent 模型管理》** | 这句纯中文问句在接线前返回 **0 条**。**这是 #1794 的验收点,已达成** |
| `定时任务不执行` | ⚠️ 有命中(2 条)但 **top 是错的**(GBK 编码那篇,不是 cron 那篇) | 别名给的是**召回**,不是这个句式下的精度;与评测中"仍有 4 条失败"一致 |
| `switch vision model` / `如何切换视觉模型` | ❓ `no_match=False hits=0` | 与**匿名配额(5 次/天/IP)被本轮探测用尽**的表现一致;改用本机 token 复验时 `misakanet.org` 出现 TLS 握手超时(本会话反复出现,属网络抖动),**未判定** |

**下次复验请带 token**(本机可用:`/tmp/pub-cc/.misakanet-agent/token` 或安装器写入的 `~/.misakanet-agent/token`),并顺手确认:

```bash
curl -sS "https://misakanet.org/api/search-signals/stats?days=7" | python3 -m json.tool # 期望 200 + rows 非空且在增长
curl -sS https://misakanet.org/mcp -H 'Content-Type: application/json' -H 'Accept: application/json' \
-H 'MCP-Protocol-Version: 2025-06-18' -H 'Origin: https://misakanet.org' \
-H "Authorization: Bearer $TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"misakanet_search","arguments":{"query":"定时任务不执行","top":2}}}'
```

**不要把"两次无法判定"写成通过**——这一轮已经因为"绿灯掩盖真红"付过代价(见 §6)。

**仍未做的**:`#1780` 的 FAQ 匹配器没有跟着展开(阈值语义会变,离线评测看不到 FAQ 语料);`trigger` 尚未并入 BM25 索引文本。两条都写在 `docs/maintainer/query-alias-design-2026-09-16.md` §8.7。
Loading