Positron 数据资源管理器列摘要慢源探索性测试:10 秒超时、Retry 与 Continue 的缺陷复盘
开发工具代码编辑器数据科学【免费下载链接】positronPositron, a next-generation data science IDE项目地址https://gitcode.com/gh_mirrors/po/positron点击查看免费下载本文以 Positron 仓库中.claude/skills/exploratory-test/renderer/fixtures/typed-steps.md探索性测试渲染器的 typed-steps fixture为主体复盘一次针对数据资源管理器Data Explorer列摘要column summaries在慢数据源上的行为的探索性测试被测变更是将列画像column profile请求超时从 60 秒降至 10 秒并引入分速加载paced loading与 Retry 提示。测试在 pandas 与慢速模拟源上跑了 4 个场景最终确认了两个缺陷超过 10 秒的列永不加载且 Retry 无效major复现 3/3、Continue 加载的是屏外列而非可见列moderate复现 2/2。读完本文你将理解该报告的完整结构与复现方法、慢源构造工具slow.py的工作原理以及超时、重试、暂停/继续在源码中的真实实现tableSummaryCache.ts、languageRuntimeDataExplorerClient.ts。文档定位探索性测试渲染器的 typed-steps fixturetyped-steps.md位于探索性测试技能exploratory-test skill的渲染器 fixtures 目录下与ledger.md、logs-run/report.md、logs-run/ledger.md并列是渲染器render.mjs的输入样例。它演示了typed steps带类型化步骤动作、VERIFY、Observed、Evidence、Log的报告写法同时也是技能规范的一部分——SKILL.md 定义了探索性测试的执行流程子代理驱动、验证、渲染、发布explorer.md 则定义了测试者explorer agent的报告与 ledger 书写规范。该 fixture 的报告骨架如下# Exploratory test: what you tested branch | short sha PR: owner/repo#number **Result:** one sentence: what the change now does for a user **Tested:** what you exercised, in a phrase **Not exercised:** surfaces the change touches that you did not reach ## Findings ## Coverage对应到本 fixture其元信息为PRposit-dev/positron#1234分支与提交midleman/exp-ab-dx-opus|ed2487a1a2ResultColumn summaries load and pause on schedule.A column over 10 s never loads, and Continue loads the wrong columns.Testedthe summary panel on pandas and a slow source, 4 scenariosNot exercisedthe web build被测变更超时收紧 分速加载 Retry 提示logs-run/report.md的 Run detailsChange under test明确写明了本次测试的对象The column-profile request timeout drops from 60 s to 10 s, with paced loading and a Retry notice.即本次变更包含三个要素列画像请求超时从 60 秒降到 10 秒分速加载paced loading列摘要不是一次性全部请求而是分批、按节奏抵达避免单个慢源把整个面板拖垮Retry 提示当摘要计算失败时面板顶部出现Some summaries unavailable. Retry通知条。这些要素都能在源码中找到对应实现。超时常量定义在 languageRuntimeDataExplorerClient.tsconst COLUMN_PROFILE_TIMEOUT 10_000;请求超时后前端会以如下错误拒绝Error: get_column_profiles timed out after 10 seconds这正是本次测试在日志中捕获到的错误文本。分速加载与暂停/继续的状态机则位于 tableSummaryCache.ts其ColumnProfilesFailure类型定义了三种失败语义calculation | disconnected | paused——paused不是故障只是分速预算用尽后主动暂停。测试环境与慢源构造slow.py 与 make_slow探索性测试的通用原则是制造被测状态explorer.md 的 What this run is for 一节慢源在大表或远程表上才出现本地机器上无法自然复现因此测试者用slow.py制造了一个哈希慢的 pandas DataFrame。该文件的完整内容保存在 logs-run/files/slow.py# slow.py: builds DataFrames whose values hash slowly, standing in for a # large or remote table. Frequency tables (value_counts) get slow; counts dont. import time import pandas as pd class Slow(str): delay 0.002 def __hash__(self): time.sleep(Slow.delay) return str.__hash__(self) def make_slow(ncols20, nrows1000, delay0.002): Slow.delay delay data {fs{i:02d}: [Slow(fv{j % 50}) for j in range(nrows)] for i in range(ncols)} return pd.DataFrame(data)关键设计在于Slow继承str并重写__hash__每次哈希都sleep(delay)。由于频率表frequency table / value_counts依赖哈希计算而计数不依赖这个技巧可以精准地只拖慢摘要中的频率表部分而不影响其他路径——这正是 ledger.md 中 N02Could not make value fetches slow: the slow-hash trick only slows profiling这一未运行场景的原因。使用方式是在 Python 控制台执行%run -i slow.py然后调用make_slow()生成不同规格的慢源。本次 fixture 用到的慢源参数有调用参数含义效果make_slow(ncols20, delay0.002)20 列、每列约 2 秒约 30 秒后触发Summaries paused. Continuemake_slow(ncols1, nrows1000, delay0.012)1 列字符串、频率表约 13 秒超过 10 秒超时触发Some summaries unavailable. Retrymake_slow(ncols80, nrows1000, delay0.002)80 列、每列约 2 秒用于验证 Continue 的加载顺序两个核心缺陷Findings详解Finding 1major3/3超过 10 秒的列永不加载Retry 无法挽回症状单列频率表耗时约 13 秒 10 秒超时时列摘要永远不出现面板先显示加载点随后变成Some summaries unavailable. Retrysparkline 槽位清空点击 Retry 并等待后同样的通知再次出现。复现步骤源自 fixture以%run -i slow.py加载slow.py默认设置运行one12 make_slow(ncols1, nrows1000, delay0.012)生成一个频率表约需 13 秒的字符串列运行%view one12并等待 15 秒验证列摘要是否加载 →FAILfinding 1加载点后出现Some summaries unavailable. Retrysparkline 槽位清空点击 Retry 并等待 15 秒重复一次验证 Retry 后摘要是否加载 →FAILfinding 1每次 Retry 后仍是同样的通知。日志证据Error: get_column_profiles timed out after 10 seconds at DataExplorerClient.getColumnProfiles (languageRuntimeDataExplorerClient.ts:212) at TableSummaryCache.loadColumnProfiles (tableSummaryCache.ts:538) at TableSummaryCache.retryColumnProfiles (tableSummaryCache.ts:611)这条调用链与源码完全对应retryColumnProfiles→loadColumnProfiles→getColumnProfiles超时点在 languageRuntimeDataExplorerClient.ts 的getColumnProfiles中——它用setTimeout在COLUMN_PROFILE_TIMEOUT10 秒后 reject 掉 promise并清理其上的请求。源码角度的成因分析从源码结构看问题出在超时即放弃与重试同样超时的叠加。在 tableSummaryCache.ts 中加载是按块chunk进行的一个块内包含多列块大小按期望约 10 秒内完成来设计文件注释写明 chunks 是 sized to land near this rather than to fill the request timeout。当一个块内某一列自身就要 13 秒时整个块必然超时——而 Retry 只是重新发起同样的请求源的耗时并没有改变因此每次 Retry 都必然再次超时。文件注释中还有一句值得注意的推论a source that cannot draw eighty sparklines inside the timeout also fails to report a single missing one一个在超时内画不出 80 条 sparkline 的源也无法报告单列缺失这说明单列超时会被块级超时掩盖用户看到的是整块失败而非某一列失败。期望行为摘要应能加载或至少 Retry 后能加载例如将重试请求改为只针对失败列、或采用更宽松的超时。Finding 2moderate2/2Continue 加载屏外列而不是当前可见列症状80 列的慢源在约 35 秒后出现Summaries paused. Continue前 14 列 s00–s13 已有 sparkline将摘要面板滚动到底部s62–s79 可见后点击 Continue等待约 32 秒直到Summaries paused.再次出现——可见列 s62–s79 仍然为空仅 s62 有一条 sparkline再向上滚动一屏后发现Continue 的预算全部花在了按下按钮时处于屏外的 s49–s61 列上。复现步骤源自 fixture以%run -i slow.py加载slow.py运行slow80 make_slow(ncols80, nrows1000, delay0.002)再%view slow80等待约 35 秒直到Summaries paused. Continue出现验证 s00 到 s13 有 sparkline →PASS将摘要面板滚动到底部s62–s79 可见点击 Continue等待直到Summaries paused.再次出现约 32 秒验证可见列 s62–s79 获得 sparkline →FAILfinding 2只有 s62 有向上滚动约一屏验证 Continue 的预算花在可见列而非上方列 →FAILfinding 2s49–s61按下 Continue 时屏外获得了 sparkline。日志证据Warning: profile request for s63 cancelled源码角度的成因分析从源码结构看loadColumnProfiles在 tableSummaryCache.ts 中按列索引升序逐个或逐块请求而不是按当前视口可见列排序。Continue即retryColumnProfiles只是从上次停止的位置继续按序加载因此无论用户滚动到哪里它都会先填充索引靠前的列。测试中可见列 s62–s79 里只有 s62 获得 sparkline正是升序加载刚走到 s62 时预算再次用尽的表现而 s49–s61 之所以拿到 sparkline是因为它们在加载队列中排在可见列之前。fixture 对应的 ledger.md 还记录了 s63 的 profile 请求被取消的警告——可见列中除 s62 外的请求被后续的暂停逻辑取消了。期望行为Continue 应优先加载当前屏幕上可见的列按视口可见性排序再回填屏外列。面板通知条的设计语义paused 与 failed 的区分typed-steps.md中反复出现的三条 UI 文案——Summaries paused. Continue、Some summaries unavailable. Retry、Summaries unavailable.——在源码中由 summaryProfilesNotice.tsx 统一渲染其设计语义值得单列说明状态文案按钮语义paused分速预算用尽Summaries paused.Continue源正在正常应答只是慢已获取的 profile 会保留Continue 从停止处继续不是重新开始因此不叫 Retrycalculation失败超时等且部分成功Some summaries unavailable.Retry已算出的列保留只缺失剩余列calculation失败全部失败Summaries unavailable.Retry全部列缺失disconnected源已断开视情况显示 unavailable 文案无按钮源已消失重试只会失败故不提供 Retry 按钮retrying重试进行中Calculating summaries...—通知条在重试期间保持原位避免网格重排导致重试被中途取消组件注释还解释了为什么paused用Continue而非Retrypaused 不是故障而是用户可以逆转的选择已经取到的 profiles 不会重新请求按钮是从断点继续而不是从头再来。这正好呼应了 Finding 1 中Retry 无法挽救的问题本质——超时失败是源的真实能力限制重试同一请求不会改变结果。场景覆盖已验证与未验证typed-steps.md的 Coverage 部分区分了Verified与Not exercised对应 logs-run/ledger.md 中 S01–S09 的完整记录ledger 是测试者边跑边写的原始记录报告中的 Coverage 表由其渲染而来Verified已验证场景结果Retry on a source over 10 s per columnFails 3/3finding 1Continue after scrolling downLoads off-screen columnsfinding 2pandas frame, mixed typesint/float/str/datetime/bool/all-null 混合列Null %、直方图、频率表全部加载datetime 与全 null 列不显示 sparkline与变更前一致→ PASSPaced loading on a slow source20 列、每列约 2 秒sparkline 约每 4 秒到 2 条其余列显示加载点约 30 秒出现Summaries paused. Continue→ PASS此外ledger 还记录了 S01–S06 的基线验证边缘值all-NaN、inf、全 null 字符串、object、complex列都能出 sparkline 且无卡住的占位符健康源上展开列可看到 NaN/inf 的汇总统计polars 帧与 pandas 摘要一致DuckDB 读 Parquet 的每一列都能拿到摘要。这些验证说明慢源是唯一会触发超时/暂停路径的条件混合类型与多后端pandas/polars/DuckDB的常规路径不受影响。Not exercised未验证场景原因R data.frame / tibble 后端时间不够Python 与 DuckDB 已覆盖变更涉及的 null-vs-omitted 两种序列化Data-grid 单元格与行头占位符、Value unavailable无法让值抓取变慢slow-hash 技巧只能拖慢 profiling拖不慢值抓取Positron web本次只测了桌面构建web build 未构建报告头部与 coverage 一致地声明了Not exercised: the web build——测试者只对桌面构建负责web 端行为差异浏览器端文件对话框、剪贴板、窗口等未被触及。小结从一份探索性测试报告读到的实现问题综合 fixture 报告与源码本次探索性测试对10 秒超时 分速加载 Retry/Continue这套新机制给出了两处关键反馈超时设计对单列慢失效10 秒超时是块级粒度单列 13 秒会把整块拖下水Retry 因源耗时不变而必然再次失败用户被引导去点一个永远无法成功的按钮这正是 explorer.md 中 major 严重度的定义telling the user to take an action that cannot fix their problem。可改进方向从源码结构看包括按列粒度超时、失败列单独重试、或对 Retry 放宽超时。暂停/继续的加载顺序与用户意图错位Continue 按列索引升序回填而非按视口可见性优先导致用户滚动到屏幕底部后点击 Continue看到的仍是空列。若将加载队列改为可见列优先 屏外列回填两处体验问题都可解决。对于想要复现或扩展该测试的读者可直接使用仓库中的 slow.py 与完整的 ledger.md、report.md 作为模板相关 UI 状态的实现细节可继续阅读 tableSummaryCache.ts、languageRuntimeDataExplorerClient.ts 与 summaryProfilesNotice.tsx。赞分享开发工具代码编辑器数据科学【免费下载链接】positronPositron, a next-generation data science IDE项目地址https://gitcode.com/gh_mirrors/po/positron点击查看免费下载相关推荐Positron 数据浏览器列摘要加载的探索性测试实录从测试账本到源码级剖析Positron 数据浏览器列摘要加载的探索性测试实录从测试账本到源码级剖析 本文围绕 Positron 探索性测试技能exploratory test产开发工具代码编辑器数据科学GPT-Researcher 检索分类缺陷修复Brave 长摘要绕过爬虫管道的根因与测试实践GPT Researcher 检索分类缺陷修复Brave 长摘要绕过爬虫管道的根因与测试实践 本文基于 GPT Researcher 仓库中的 PR 说明文档人工智能AI 应用深度研究AI Agent自主智能体RAG多智能体后端BilibiliSummary5秒生成视频摘要的终极时间管理神器BilibiliSummary5秒生成视频摘要的终极时间管理神器 还在为B站视频太长而烦恼吗BilibiliSummary是一款革命性的Chrome扩展能人工智能AI 应用大模型上一篇解决wiliwili手柄连接难题从驱动到配置的完整指南下一篇Switch主题图标排列wiliwili桌面布局创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

QXlsx 入门指南:基于 Qt 的 XLSX 读写库的安装、配置与实战

QXlsx 入门指南:基于 Qt 的 XLSX 读写库的安装、配置与实战

数据分析 【免费下载链接】QXlsx Excel file(*.xlsx) reader/writer library using Qt. Descendant of QtXlsxWriter. 项目地址: https://gitcode.com/gh_mirrors/qx/QXlsx 点击查看 免费下载 QXlsx 是一个基于 Qt 框架、使用 C 开发的 Excel 文件(*.xl…

2026/10/5 1:49:20 阅读更多 →
VueUse onLongPress 详解:元素长按检测的 Hook、组件与指令三种用法

VueUse onLongPress 详解:元素长按检测的 Hook、组件与指令三种用法

前端 【免费下载链接】vueuse Collection of essential Vue Composition Utilities for Vue 3 项目地址: https://gitcode.com/gh_mirrors/vu/vueuse 点击查看 免费下载 导读 onLongPress 是 VueUse(Vue 3 组合式工具集)中用于监听元素长按…

2026/10/5 1:49:20 阅读更多 →
MRAM掉电保护实战:MR25H40CDF与PIC24微控制器SPI接口设计

MRAM掉电保护实战:MR25H40CDF与PIC24微控制器SPI接口设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:49:20 阅读更多 →

最新新闻

【关注可白嫖源码】--课程设计+毕业设计+76444基于SpringBoot的心理健康自助咨询平台设计与实现

【关注可白嫖源码】--课程设计+毕业设计+76444基于SpringBoot的心理健康自助咨询平台设计与实现

本文仅展示核心实现逻辑与部分代码片段,完整项目源码、配套文档、数据库脚本内容较多,篇幅有限无法全部放出。有需要完整资源的同学,可以在评论区留言【资料或领源码】,我会一一回复站内私信,发送完整文件摘 要当前社…

2026/10/5 2:25:36 阅读更多 →
【含视频】官方WorkBuddy应用师认证教程05 安 全 与 合 规

【含视频】官方WorkBuddy应用师认证教程05 安 全 与 合 规

对应视频: WorkBuddy应用师认证教程05安全与合规01使用决策-CSDN直播 WorkBuddy应用师认证教程05安全与合规02权限边界-CSDN直播 WorkBuddy应用师认证教程05安全与合规03输出验证-CSDN直播 WorkBuddy应用师认证教程05安全与合规04防线配置-CSDN直播 第 五 章 安…

2026/10/5 2:25:36 阅读更多 →
数据缩放(Feature Scaling)旨在将特征值映射到统一范围,避免大数值特征主导模型训练,提升收敛速度与预测精度

数据缩放(Feature Scaling)旨在将特征值映射到统一范围,避免大数值特征主导模型训练,提升收敛速度与预测精度

在 Python 编程生态中,“Scale” 是一个高频多义词。它既可以指代数据预处理中的特征缩放,也可以是 Matplotlib 中的坐标轴刻度,还能是 Tkinter 中的滑块控件,甚至涉及大模型时代的 Scaling Laws。理解不同语境下的 Scale&#xf…

2026/10/5 2:25:36 阅读更多 →
STM32+MAX6675+K型热电偶高温测温方案详解:原理、接线与代码

STM32+MAX6675+K型热电偶高温测温方案详解:原理、接线与代码

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 2:25:36 阅读更多 →
OBCA V4.0课后习题整理

OBCA V4.0课后习题整理

第一章 OceanBase 概述 【判断题】OceanBase 是 100% 自研的国产数据库,不是基于开源产品的再次开发。(√)【判断题】OceanBase 是全球唯一一个同时刷新了 TPCC 和 TPCH 世界纪录的数据库。(√)【判断题】OceanBase 是…

2026/10/5 2:25:36 阅读更多 →
AI前沿 | 2026年9月21日:Step 5 大模型来了 + 600B 稀疏 MoE 架构 + 1/8 成本 API

AI前沿 | 2026年9月21日:Step 5 大模型来了 + 600B 稀疏 MoE 架构 + 1/8 成本 API

AI前沿 | 2026年9月21日:Step 5 大模型来了 600B 稀疏 MoE 架构 1/8 成本 API 📖 首屏导读 本教程配套付费专栏:《大模型工程师修炼手记》 19.9 元(AI 编程 Agent 实战 本文同主题系统课程) 《AI时代程序员的自我…

2026/10/5 2:24:36 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →