fix(相位/安全): 部署门禁只判产物自证;静默 break 改成出声;内核读数带时间坐标
pi 2026-09-14 的裁定与两条更正,逐条落地。 1. **相位裁定(选 c)**:`packaging`/`build-stamp` 属于**构建相位**,不属于安装相位。 `run-all.mjs` 现在有相位:`AGENTMAIL_CRITERIA_PHASE=install`(部署门禁用)。 每条判据登记它读的哪一侧(`ARTIFACT`/`SOURCE`),install 相位里出现 SOURCE 侧判据 → 红; 被跳过的判据**点名打印**,不静默丢。汇总打 `RESULT phase=build|install`。 规则入册 `test/CRITERIA.md` §11(含三个真实实例:check-shared-libs 恒红、 packaging 一改前端就卡死、HOME 在门禁跑完之后才炸)。 安装相位**真正能判的那一半**:`deploy/install.sh` 读**产物自证**(不重算 dist)—— `releaseCandidate !== true` → 拒绝;产物 `gitRev` ≠ HEAD → "这个包比源码旧" → 拒绝; 放行要显式 `--allow-dirty` / `--allow-stale`;`--check` 干跑只报结论不拦。 实测干跑输出:`产物:gitRev=6702cc2 树=dirty releaseCandidate=false | 当前 HEAD=6702cc2` → 报"不是发布候选 + 正式安装会被拒绝 + 要放行请显式说清"。 2. **别解析运行器文本**(pi §5):`broken`/`red` 的判定改成按 TAP 的**名字**—— 文件级失败的测试名就是路径,断言失败的名字是判据名。变异双向验证: 未定义标识符 → 「跑不起来的判据」;把某条判据条件改成假 → 「红的判据」。 不再往关键字表里加补丁(那是往文本解析里加补丁,方向是错的)。 3. **静默 break 是安全相关**(pi §3):`session_update` 找不到活动会话时不再静默 break, 改成出声日志(走 journalctl 那条通道),写清两种成因(此刻没在跑 / **接管会话**重启后无法定位)、 方向(收紧被延迟)、以及兜底的**前提**("下次投递"要求这条会话还会收到新邮件)。 `lib/mail-session-id.js` 模块头同步改成安全相关措辞("人以为自己收紧了权限、实际没有"), 四桥逐字节同源,`check-shared-libs.sh` 退出码 0。 4. 内核读数补时间坐标(pi 13ea2fdf):`BUILD_INFO.txt` 里除原始 `dep`/`=>` 行外, 现在还有 `kernelBinMtime` 与**正在运行的进程启动时间** —— 二进制会在两次读数之间被换掉, 没有时间坐标的读数不成立。
This commit is contained in:
@ -2172,9 +2172,26 @@ function permissionPrompt(data: any): string {
|
||||
if (!sid || !pm) break;
|
||||
const found = findLiveDshSession(sid);
|
||||
if (!found) {
|
||||
// 会话不在运行(插件重启后尚未收到新邮件、或从未投过)。
|
||||
// 无需处理:下次投递时 deliverMail 会按邮件里带的 permission_mode
|
||||
// 重新 applyPermissionMode,档位不会丢。
|
||||
/*
|
||||
* ⚠ **安全相关**(pi 2026-09-14 裁定):这不是"外观恢复不了",而是
|
||||
* **"人以为自己收紧了权限、实际没有"** —— 方向是收紧,正是危险的那一侧。
|
||||
*
|
||||
* 两种成因,都靠这一行日志才看得见:
|
||||
* ① 这条会话此刻确实不在运行(插件刚重启、或从未投过信);
|
||||
* ② 这是**接管会话(adopted)**:它的 DSH 会话 id 由平台生成,
|
||||
* 从邮件会话 id **推不出来**,只能靠内存映射 —— 重启后那张表是空的,
|
||||
* 于是这条更新永远找不到目标(见 lib/mail-session-id.js 的模块头)。
|
||||
* 两种情形在这里**无法区分**(能区分就需要一张落盘的映射),所以日志把两种都写出来。
|
||||
*
|
||||
* 兜底是"下次投递时按邮件里带的 permission_mode 重新 apply",但**它依赖将来还有邮件**:
|
||||
* 一条只被收紧、之后再没有新邮件的会话,等于**没有兜底**。
|
||||
* 所以这里**不许静默 break**:静默 break 是这个坏情形的唯一成因。
|
||||
*/
|
||||
console.error(
|
||||
`[dsh-mail-bridge] ⚠ session_update ${sid} 的档位 ${pm} **未能应用**:` +
|
||||
`找不到正在运行的 DSH 会话(可能是"此刻没在跑",也可能是**接管会话**重启后无法定位)。` +
|
||||
`若这是一次**收紧**,在下次投递之前 DSH 运行时仍按旧档执行 —— 而"下次投递"要求这条会话还会收到新邮件。`
|
||||
);
|
||||
break;
|
||||
}
|
||||
applyPermissionMode(found.agent?.session, pm);
|
||||
|
||||
Reference in New Issue
Block a user