From dae508b25bda03e8b8869703990af920f456f4a0 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Mon, 14 Sep 2026 16:50:33 +0800 Subject: [PATCH] =?UTF-8?q?docs(=E5=88=A4=E6=8D=AE):=20=E8=A1=A5=E3=80=8C?= =?UTF-8?q?=E5=B7=B2=E7=9F=A5=E9=99=90=E5=88=B6=E3=80=8D=E4=B8=8E=E3=80=8C?= =?UTF-8?q?=E7=BC=BA=E7=9C=81=E8=AF=AD=E4=B9=89=E7=99=BB=E8=AE=B0=E3=80=8D?= =?UTF-8?q?=E4=B8=A4=E8=8A=82=EF=BC=9Bbuild.sh=20=E6=8A=8A=E5=8E=9F?= =?UTF-8?q?=E5=A7=8B=20dep/=3D>=20=E8=A1=8C=E5=86=99=E8=BF=9B=20BUILD=5FIN?= =?UTF-8?q?FO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pi 2026-09-14 两件: 1. **登记册真的没有**。我上封信说"已写进 test/CRITERIA.md 的已知限制一节"——**不成立**, 只有 `appearance-defaults.test.mjs` 里有那段注释。已在 CRITERIA.md 补 §9「已知限制」 (标识符只解析一层;静态判据的到期前提是"本工作区能装能点")。 过度声明自己做过什么是这轮反复出现的那一类错,这次是同一个形状的又一例。 2. **新建 §10「缺省语义登记处」**(pi 的更正:不是无条件 fail-closed,而是"缺了的后果必须 有人登记 + 写明谁批准了这个方向")。三条入库,各带依据: · 邮件 `permission_mode` 缺 → **不写、不改档**(窄),依据是本轮那个 `|| 'workspace'` 兜窄档的坑; · HomeAgent `plugin.json.sdk` 缺 → 内核**不读**(不是语义,是文档),依据内核 manifest.go 结构体 + registry.go; · HomeAgent `capabilities` 缺 → **不受限**(宽),依据内核注释明写的理由:17 个存量清单都没有它。 3. `build/BUILD_INFO.txt` 现在**原文贴入** `go version -m <内核>` 的输出,并附"这两行怎么读" (`dep … vX.Y.Z` 后面跟 `=> … (devel)` 时那串版本号只是 require 行残留;`=>` 必须按模块名联接)。 理由:这场争论的全部内容就是这两行该怎么读,原始证据必须和结论放在一起。 --- client/electron/test/CRITERIA.md | 31 ++++++++++++++++++++++++++ plugins/homeagent-mail-bridge/build.sh | 11 +++++++++ 2 files changed, 42 insertions(+) diff --git a/client/electron/test/CRITERIA.md b/client/electron/test/CRITERIA.md index 13787de..45989e1 100644 --- a/client/electron/test/CRITERIA.md +++ b/client/electron/test/CRITERIA.md @@ -324,3 +324,34 @@ git worktree add /tmp/attr HEAD # (这也是为什么 `BUILD_INFO.json` 要记 `gitRev`/`gitDirty`:产物自带来源,比事后猜强)。 **一句话**:归因手段的选择标准是"**会不会让别人的东西处于危险里**",不是"哪条命令最快"。 + +## 9. 已知限制(登记处) + +判据的**能力边界**必须写在这里,否则它的长期结局只有两个:被当成"它就是全能的"而误用, +或者被反复问"为什么它读不懂"。 + +**9.1 标识符只解析一层**(pi 2026-09-14;实现见 `appearance-defaults.test.mjs`) + +需要比对"某个常量两边是否一致"时,判据会跟一层标识符(例如 `const R = TOKENS.radius`)。 +**再深就不跟了**:那不是"读一个常量",而是"执行 Go/TS",判据会直接报"读不懂"并要求人看一眼。 +后果:如果常量经过两层以上转发,判据会红(而不是误判为不一致)—— 这是有意的取向: +**宁可报读不懂,也不猜**。要覆盖两层,正解是把值写进一个显式的契约文件,而不是加强解析。 + +**9.2 静态判据的到期前提是"本工作区能装能点设备"** + +5 条鸿蒙侧的判据只能验形态(`RESULT static=5`)。前提一旦成立,套件**自动变红** +(探针三值:可用 / 不可用 / 拿不准→红)。到期报文里会列出需要放行的目录(在工作区外)。 + +## 10. 缺省语义登记处(不是"默认值",是"缺了意味着什么 + 谁批准") + +pi 2026-09-14 提的形状:**不是无条件 fail-closed** —— 缺字段可以是"宽"也可以是"窄", +**不可接受的只有"缺了却没人知道它意味着什么"**。所以这里登记的是缺省**语义与方向**。 +理由要带上:反例来自 HomeAgent 内核自己的 `PluginManifest.Capabilities`, +它的注释写明"省略或为空 = **不受限**",因为 17 个存量清单都没有这个字段, +若把空声明当最小权限,它们会全部静默失去 IO 注入与记忆读写。 + +| 字段 | 缺省语义 | 方向 | 谁批准 / 依据 | +| --- | --- | --- | --- | +| 邮件的 `permission_mode` | **不写、不改档**(不是写默认档) | 窄(fail-closed) | 本仓 2026-09-14:缺字段被 `\|\| 'workspace'` 兜成窄档,等于"一个 bug 以正常形态活着";守卫见 `plugins/*/lib/permission-mode.js` 的 `modeForStateWrite` | +| HomeAgent `plugin.json` 的 `sdk` | **内核不读**(字段只对人有效) | 无(不是语义,是文档) | 内核 `internal/plugin/manifest.go` 的结构体里没有该字段;`registry.go` 的 `loadOne` 只用 `NameZh/NameEn` | +| HomeAgent `plugin.json` 的 `capabilities` | **不受限** | 宽(fail-open) | 内核注释明写理由:17 个存量清单都没有它,空声明当最小权限会让它们**静默降级** | diff --git a/plugins/homeagent-mail-bridge/build.sh b/plugins/homeagent-mail-bridge/build.sh index 29ae908..df8377d 100755 --- a/plugins/homeagent-mail-bridge/build.sh +++ b/plugins/homeagent-mail-bridge/build.sh @@ -101,11 +101,22 @@ BIN="build/plugin.bin" [[ -f "$BIN" ]] || die "没找到产物 $BIN" echo "[build] 产物:$BIN($(stat -c%s "$BIN") 字节)" echo "[build] 本次身份:SDK=$SDK_DIR hash=$SDK_HASH version=${SDK_VER:-未知}" +# 原始证据与结论放在一起(pi 2026-09-14):这场争论的全部内容就是 +# "`dep` 行与 `=>` 行该怎么读",把两行原文贴进来,下一个人不必重演。 cat > build/BUILD_INFO.txt < vX.Y.Z\` 后面若跟着 \`=> (devel)\`,那个 vX.Y.Z 只是 require 行 +# 的**文本残留**,不代表实际编译用的代码;本次的 SDK 源码以上面的 sdkDir/sdkHash 为准。 +# · \`=>\` 必须按**模块名联接**读取(先定位 SDK 的 dep 行,只接受紧跟其后那条), +# 不能取"整份输出里第一个 =>"。 EOF echo "[build] 已写 build/BUILD_INFO.txt —— 部署后请回看内核日志确认握手:" echo " grep -a 'mail-bridge' /home/newqqagent/log/homed_*.log | tail -5"