fix: 会话列表工作态不再受 health 否决 - #73
Conversation
Ordinary and favorite rows share one gesture owner: online short-press opens, offline short-press does not navigate, long-press shows exactly one favorite action. Working uses the existing busyDot lamp frames; idle is static; unknown/abnormal play no animation and do not show question marks or repeated 未知. The right side is the official Provider mark from the status-core DTO, with pinned LobeHub SVG bytes.
Workspace and favorites production routes now share one SessionRow (title + cwd, 66dp). Runtime AndroidSVG and LobeHub SVG copies are removed because the frozen visual source JPEG contains no Provider glyphs to crop. Canonical ids stay closed; no invented marks.
Reuse icon() inline SVG fallbacks for claude_code/codex/grok/cursor. Copilot and Pi have no source glyph; those rows stay blank.
Exact drawable-nodpi bytes from 96a075f (R.drawable.provider_pi / provider_copilot_color). No overlay, no LobeHub download.
Exact prior-app LICENSE/NOTICE blobs for the two reused PNGs only. KDoc @contract/@inv/@consumes on touched UI files; no icon regeneration.
Grok tiles use BRAND img slug grok, not icon() dead X switch. Pi working+normal DTO still maps to shared busyDot; no status-core change.
Partial reversal of the activity gate introduced in 1dc7443 (parent 23e0c4f), on owning PR #73. Keep offline, abnormal/malformed health and unknown activity quiet; do not erase authoritative working/idle merely because health is unknown. Keep provider marks, naming, gestures, favorites, server and nodeprobe unchanged. Add separate Grok and Codex working/unknown-health Compose regressions and correct the contradictory projection expectations. Executed standalone Kotlin against exact Models.kt source: 300 combinations, 12 failures before, 0 after. Full Gradle/Compose/device/daemon acceptance not run. Does not claim to fix the separate Pi server regression or Codex naming. No merge, deployment, production :9900 access or history rewrite.
已在原 PR 撤掉已复现的 App 引入点;未 merge / 未部署本次独立追踪 Grok 工作动态、Codex 工作指示、Codex 名称、Pi 服务端状态四条问题。此提交只处理前两条中已确认的 App known-activity + unknown-health 投影错误,不把 Pi 两端缺失工作状态或 Codex 显示名问题合并进来。 命中坐标
这是在引入 PR 上撤掉错误条件,不是整体 根因与最小撤销修改前 Models.kt L90–L102 中 本次只将谓词改为: if (health != "normal" && health != "unknown") return SessionRowMotion.None不推断 Provider,不伪造 activity,不把 unknown activity 当 idle。该函数对离线、显式 abnormal 和直接传入的非法 health 仍返回 None;上游 wire 解码/归一化没有修改,不把这个函数级断言冒充全协议验证。 先红后绿:本次确实执行的范围直接以 Kotlin/JVM 编译仓库 完整 Models.kt,依赖仅取未改动的 L2Status enum;没有用 Python 重写产品判断。输入为合成 SessionItem,6 Provider × 5 activity × 5 health × 2 online = 300 组。
已加入原测试文件的独立用例只修改两个文件:Models.kt 与 ExternalSessionStatusUiTest.kt。既有投影测试撤掉“Busy/Idle + unknown health 必须 None”的错误断言,并保留/补强 unknown activity、abnormal、offline 和直接非法 health 的反例。 Grok 与 Codex 各有独立 Compose 虚拟时钟测试,要求 working 语义存在且 950ms 后帧变化: cd app
./gradlew :app:testDebugUnitTest \
--tests 'dev.agentmirror.app.ui.ExternalSessionStatusUiTest.grokWorkingUnknownHealthAdvancesLampFrames' \
--tests 'dev.agentmirror.app.ui.ExternalSessionStatusUiTest.codexWorkingUnknownHealthAdvancesLampFrames' \
--tests 'dev.agentmirror.app.ui.ExternalSessionStatusUiTest.fourAxisProjectionKeepsUnknownActivityQuietWithoutVetoingKnownActivity' \
--rerun-tasks --no-build-cache以上 Gradle/Compose 命令在本次环境 未执行,不能沿用旧 HEAD 的绿色收据为新 HEAD 背书。需要 Android/Gradle 环境执行后再做设备验收。其他已有 PR 的静态组合或已安装 APK 不会因这个 owning 分支更新而自动改变。 分开的后续边界
没有 merge、构建/安装 APK、替换探测二进制、重启 daemon 或访问 |
会话行的工作动画只消费 activity 与在线状态,health 保持独立展示,修复服务端返回 working 而外部列表不显示工作态的问题。
原修复 e7e7779 在本 PR 追加合入已验 nodeprobe main,当前 head 9e04b7c。App subtree 与原 PR73 完全相同;tools/nodeprobe subtree 保持已验 N bdc49c7b8cbaad7604e8c2a7066d89784d9d8abf;唯一文本冲突 DELIVERY.md 已保留两份原始收据。
验证:新 head 的 PR73 activity projection run 34143541172 success;历史决定性红绿为 run 34089083105 / 34091745276。leader已核合并 parents、完整14路径差量及两产品 subtree。用户已用最终 App 组合 APK 完成手机验收并授权合并;最终名称与三面收藏组合随后通过 #89 进入 main。历史未闭架构门不追认为通过。