refactor(board-ui-nav): 台架存证迁入技能目录 artifacts/,ci-artifacts 清零

存证目录从仓库根的 ci-artifacts/ 搬进技能自己名下,规则更直观:谁的
证据跟谁走,不再堆在杂物区。

- board_ui_nav.py 新增 STORAGE_ROOT 常量,WALK_DIR 与 --walk 的默认
  落点改指 .dsh/skills/board-ui-nav/artifacts/uinav/walk
- --outdir 的反向拒绝判据同步改口径:允许区从此前只认 ci-artifacts
  字样,改为认存证根或 ci-artifacts 两处,避免新位置被直接拒跑
- 新增技能级 .gitignore(artifacts/),沿用 serial-assistant 等技能
  内忽略运行时产物的先例;208 个存证文件均不入库
- 手册与流程文档的归档路径同步;wavebench 与 uinav、uiwalk 同属一套
  台架流程产物,随导航器一并归位
This commit is contained in:
2026-11-15 19:49:51 +08:00
parent 96a3d15efc
commit 16cc064385
5 changed files with 33 additions and 22 deletions
+17 -13
View File
@@ -26,7 +26,7 @@
按 s/l 无效、要按 e 才进菜单,2026-10-26 task-24 台架实测)
--board / --walk 属真机动作:必须另加 --i-hold-bench-lock 显式确认已持 bench 锁,
否则直接拒绝(退出码 3,不碰网络)——台架是独占资源,脚本不替人判断有没有在用。
--walk 的存证目录默认在 ci-artifacts/uinav/walk(版本控制之外),--outdir 可改;
--walk 的存证目录默认在 .dsh/skills/board-ui-nav/artifacts/uinav/walk(版本控制之外),
落在版本控制内会被直接拒绝——台架证据不进工作树,工作树才能保持干净可比对。
2026-10-31 板级远程半轮补三条(本文件当这三条的纪律属主;事实现场见
docs/子系统设计/故障录波设计说明.md §10「板级远程半轮记录」):
@@ -78,9 +78,13 @@ REPO = os.environ.get("DTU_REPO_ROOT") or os.path.abspath(os.path.join(HERE, os.
HARNESS = os.path.join(REPO, "simulator", "tests", "check_content_pages.py")
SIM_EXE = os.path.join(REPO, "simulator", "build", "Debug", "lvgl_sim.exe")
MENU_TREE = os.path.join(REPO, "ui_menu_tree.txt")
# 台架存证根:跟着技能走(.dsh/skills/board-ui-nav/artifacts/,该目录 .gitignore 已排除)。
# 这些是**跑出来的产物**(截图/步迹/抓屏帧),能重跑、按窗口覆盖、体积大,一律不入库;
# 判据与仓库根 .gitignore 里 ci-artifacts/ 那段一致。
STORAGE_ROOT = os.path.join(REPO, ".dsh", "skills", "board-ui-nav", "artifacts")
# 真机留档帧目录:不在版本控制里(各次台架各自的产物),缺就跳过那一段并说明
WALK_DIR = os.environ.get("DSH_UINAV_WALK") or os.path.join(REPO, "ci-artifacts", "uinav", "walk")
# 2026-11-02 #69:原默认 ci-artifacts/uiwalk 与 --walk 的存证目录 uinav/walk 两处不一——
WALK_DIR = os.environ.get("DSH_UINAV_WALK") or os.path.join(STORAGE_ROOT, "uinav", "walk")
# 2026-11-02 #69:原默认 uiwalk 与 --walk 的存证目录 uinav/walk 两处不一——
# 每次台架走新帧,BOARD_TRUTH 那段永远读不到(静默"跳过(无留档)"),两处并一。
# 轨迹/失败帧**默认不写进仓库**:只有 --trace / --dump-fail 显式给了路径才落盘
# (判据脚本自己在提交门禁里跑,顺手往 scripts/ 写 json 就是把工作树弄脏)
@@ -1052,7 +1056,7 @@ class Navigator(object):
# ---------------------------------------------------------------- 自检与入口
# Lead 大窗留档帧(ci-artifacts/uiwalk/)的身份。
# Lead 大窗留档帧(artifacts/uiwalk/)的身份。
# ⚠ 右边的期望值**不是照抄文件名**:本表按"认屏结果应当是什么"来写,实测证据是
# 文件名声称到达的 9 个态里只有 3 个真是那个态(00 根 / 01 装置信息 / 02 交流量),
# 其余 6 帧的墨量与内容说明它们停在别处——03 是**菜单级联**(ink 4961、没有页标题)、
@@ -1442,7 +1446,7 @@ def main(argv):
ng, badg = selftest_safety_gates(clf)
print("汇总:黄金参考 %d 帧错 %d;留档帧 %d 帧错 %d;闭环 %d 页失败 %d;硬闸用例 %d 条错 %d"
% (nr, len(badr), n, len(bad1), m, len(bad2), ng, len(badg)))
# 留档帧目录(ci-artifacts/uiwalk,不受版本控制)可以不存在 → 那一段不算失败;
# 留档帧目录(artifacts/uiwalk,不受版本控制)可以不存在 → 那一段不算失败;
# 但黄金参考与闭环必须真跑过:任一为 0 说明这次"自检"其实什么都没检查
return 1 if (badr or bad1 or bad2 or badg or nr == 0 or m == 0 or ng == 0) else 0
if "--walk" in argv:
@@ -1451,22 +1455,22 @@ def main(argv):
return rc
# 台架窗口用:一条命令走完菜单树上**所有绑定页**,每页存一帧 + 一份轨迹。
# 之所以要"一条命令",是因为 5 分钟窗口里没时间让人逐页手按;跑完只需把
# 存证目录(默认 ci-artifacts/uinav/walk/)与 --trace 落下的步迹交给 Lead,
# 存证目录(默认 artifacts/uinav/walk/)与 --trace 落下的步迹交给 Lead,
# 判据失败在哪一屏、当时认出的是什么都在文件里,不用现场再猜。
pid = None
# 存证**必须落在版本控制之外**。第一版写 HERE/walk = <仓库根>/scripts/walk/,等于
# 把台架产物写进工作树:git status 立刻脏、done 的并集残留审计会把它当成任务遗留
# 物,下一个窗口还盖掉上一个窗口的证据。默认落 ci-artifacts/uinav/walk/(已
# gitignore,本仓台架产物一贯在此),--outdir 可改。
# 反向拒绝:落在版本控制内且不在 ci-artifacts 之下就**直接不跑**——规矩一旦依赖
# "跑完记得删",它就只防得住记得的人(这条道理同 bom-guard 的立项理由)。
# 物,下一个窗口还盖掉上一个窗口的证据。默认落 artifacts/uinav/walk/(技能目录下已
# gitignore),--outdir 可改。
# 反向拒绝:落在版本控制内、又不在忽略区(台架存证根或 ci-artifacts)之下就**直接不跑**
# ——规矩一旦依赖"跑完记得删",它就只防得住记得的人(这条道理同 bom-guard 的立项理由)。
outdir = argv[argv.index("--outdir") + 1] if "--outdir" in argv else \
os.path.join(REPO, "ci-artifacts", "uinav", "walk")
os.path.join(STORAGE_ROOT, "uinav", "walk")
rp = os.path.abspath(outdir)
if rp.lower().startswith(os.path.abspath(REPO).lower() + os.sep) \
and ("ci-artifacts" not in rp.lower()):
and not any(seg in rp.lower() for seg in ("ci-artifacts", os.sep + "artifacts" + os.sep)):
print("[FAIL] --walk 的存证目录不能落在版本控制内:%s" % rp)
print(" 默认 ci-artifacts/uinav/walk/;换目录请用 --outdir <忽略区里的路径>")
print(" 默认 %s;换目录请用 --outdir <忽略区里的路径>" % os.path.join(STORAGE_ROOT, "uinav", "walk"))
return 3
print("⚠ --walk 直连真机:调用方必须已持 bench 锁;存证目录 %s" % rp)
dev = BoardDevice()