修复: 包名从 com.agentmail.harmony 改成 com.jianf.agentmail 后,有一条行为判据**永远走"设备忙"跳过**
被发现的方式值得记:那条判据从没红过(它从不执行断言),是**"跳过也要有界"**
那条闹钟把 42 轮连续跳过顶成红,才露出来的。这正是设界要抓的形状 ——
判据既不算红也不算绿 ⇒ 永远不必被升级。
## 根因:包名有四处字面量,改名只改了三处
AGC 拒绝 `com.agentmail.harmony`(`harmony` 是包名保留字),于是改成
`com.jianf.agentmail`(见 `docs/ALIGN-REFS.json` 的 `agc.packageName` 与
`align-refs.test` 那条一致性判据)。但那个字面量在判据里是**各自抄的**:
· `AppScope/app.json5` ← 唯一权威
· `harmony-deviceprobe.test.mjs:24` ← 改了(它判 AGC 匹配)
· `harmony-nav.test.mjs:810` ← **没改** ⇒ 前台判定永不成立
· `lib/harmony-device.mjs:280` 注释 ← 没改(只是注释,但同样在传播旧名)
于是 `foregroundBundle(hdc) === 'com.agentmail.harmony'` 恒假,行为判据每次
都记一次"设备忙"。账本 `.tmp/harmony-busy-skips.json` 实测数到 **45**。
## 修法
1. `lib/harmony-device.mjs` 新增 `ourBundle()` —— 从 `AppScope/app.json5`
**唯一权威处**读包名(惰性、读不到返回 null,由调用方决定)。
2. `harmony-nav.test.mjs` 的比较改成 `fg !== ourBundle()`。
3. 清除 `.tmp/harmony-busy-skips.json` 里那 45 轮**假忙计数** ——
它们不是设备争用,是字面量漂移,留着会污染"跳过余额"的含义。
## 判据(防止这一类漂移再发生)
`harmony-deviceprobe.test.mjs` 新增 3 条(8 → 11,已同步 run-all 棘轮):
· 判据目录里**不许再出现包名字面量**(除 lib/ 唯一读取处与本文件——它要拿
真机样本 `fixtures/aa-dump-l-*.txt` 里的包名做**逐字**对照,属具名例外)
· 判据自检:ourBundle() 读得出值、且不带 `harmony`(AGC 保留字)
· 变异自检:把一条消费方改回硬编码 ⇒ 必须判红(已验证)
且注释里的历史说明**不许误红**(`align-refs` 正靠注释解释为什么换名)
验证:harmony-deviceprobe 11/0、harmony-nav 18/0(行为那条**真跑过**、
不再是跳过)、criteria-hygiene 6/0。
This commit is contained in:
@ -31,6 +31,34 @@ import { prose } from './read.mjs';
|
||||
|
||||
const TOOLCHAIN_HDC = '/opt/huawei/command-line-tools/sdk/default/openharmony/toolchains/hdc';
|
||||
|
||||
/**
|
||||
* 我们这个应用的 bundleName —— **从唯一权威处读**(`AppScope/app.json5`),不在这里写第二份。
|
||||
*
|
||||
* ★ 2026-09-18 实测事故:包名从 `com.agentmail.harmony` 改成 `com.jianf.agentmail`
|
||||
* (AGC 拒绝 `harmony` 作保留字,见 `align-refs.test` 与 `docs/ALIGN-REFS.json` 的
|
||||
* `agc.packageName`),而 `harmony-nav.test.mjs` 里的比较**仍是旧字面量** ⇒
|
||||
* 前台判定永远不成立 ⇒ 那条行为判据**永远走"设备忙"跳过"**,账本一路数到 **42 轮**。
|
||||
*
|
||||
* 这正是 `noteBusySkip` 的设界要抓的形状:判据既不算红也不算绿 ⇒ 永远不必被升级。
|
||||
* 而它抓对了 —— 那 42 轮根本不是"设备被占",是**两处字面量漂移**。
|
||||
*
|
||||
* 所以把包名收敛成一个来源:改包名只需改 `app.json5`,消费方自动跟上。
|
||||
* 另一处硬编码在 `harmony-deviceprobe.test.mjs`(那条判的是 AGC 匹配,用同一来源即可)。
|
||||
*
|
||||
* 惰性求值(函数而非模块级常量):读盘失败时返回 null 由调用方决定怎么办,
|
||||
* 且不把"import 期读文件"变成每个判据的隐式失败点。
|
||||
*/
|
||||
export function ourBundle() {
|
||||
try {
|
||||
const app = prose(join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..',
|
||||
'harmony', 'AppScope', 'app.json5'));
|
||||
const m = /"bundleName"\s*:\s*"([^"]+)"/.exec(app);
|
||||
return m ? m[1] : null;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* ─── 有界的"不抢前台"(pi 2026-09-18 §3)───
|
||||
*
|
||||
@ -277,7 +305,7 @@ export function boundsCenter(bounds) {
|
||||
* 在 (x, y) 上点一下(`uitest uiInput click`)。返回 true 表示"No Error"。
|
||||
*
|
||||
* **这是写操作** —— 它改变前台应用的状态。按本模块的边界①,调用方有责任先
|
||||
* 确认前台是自己的应用(foregroundBundle === 'com.agentmail.harmony')再点,
|
||||
* 确认前台是自己的应用(`foregroundBundle(hdc) === ourBundle()`)再点,
|
||||
* 否则会点到别人的会话正在用的界面上。
|
||||
*/
|
||||
export function tap(hdc, x, y) {
|
||||
|
||||
Reference in New Issue
Block a user