Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
184 commits
Select commit Hold shift + click to select a range
0e0fd1a
chore(workspace): pnpm workspace 骨架,server 并入根 lockfile
zyoncode Aug 27, 2026
69aa418
feat(harness-core): 图运行时、进程监工、模型闸、事件总线、评测统计
zyoncode Aug 27, 2026
5f4b773
feat(harness-testing): E2E 测试这个垂类的 domain pack
zyoncode Aug 27, 2026
e8be3af
feat(apps): agent 与 runner 两个进程
zyoncode Aug 27, 2026
293011b
feat(gateway): 网关退成图定义、运行记录与环境绑定的所有者
zyoncode Aug 27, 2026
0a3f470
feat(web): 一个工作台代替五扇门,浮层统一成 drawer
zyoncode Aug 27, 2026
2fe0d94
test(fixtures,evals): 假规格、人写的黄金清单、进仓库的评测定义
zyoncode Aug 27, 2026
f40b5ca
docs: 重构规格十一份 + 阶段一 review 指南
zyoncode Aug 27, 2026
5640c1a
test(fixtures): Swag Labs 作为基准应用,素材与黄金清单
zyoncode Aug 27, 2026
370d29d
fix(casegen): 写用例的那个节点从来没见过规格
zyoncode Aug 27, 2026
78d0ee7
fix(review): 修复循环改过的东西现在跟着批准走到看板
zyoncode Aug 27, 2026
ce07a0d
fix(export): 导出的工程保住机器判据,中文标题不再互相覆盖
zyoncode Aug 27, 2026
933b469
chore: 忽略清库时移走的数据备份目录
zyoncode Aug 27, 2026
343fafe
feat(explore): 探索改成循环,并且说出自己走到哪为止
zyoncode Aug 27, 2026
e90d3ae
docs: 新增 11「从探索到可运行代码的全流程」,并跟上这一轮的修复
zyoncode Aug 27, 2026
0340379
fix(explore): 十次真跑改出来的探索循环——1 屏/910 秒 → 14 屏/45 秒
zyoncode Aug 27, 2026
5de02b7
fix(explore): 兜底来的名字必须标明它不是界面文案
zyoncode Aug 27, 2026
48a4280
feat(model): 接入 TokenHarbor,全部走 qwen3.8-27b:free
zyoncode Aug 27, 2026
e7895ea
fix(exec): 规划失败不是断言失败;生成的步骤必须是动作不是目标
zyoncode Aug 27, 2026
3747176
feat(explore): S1 — 探索产出状态转移图,状态抽象做成可替换组件
zyoncode Aug 27, 2026
a541290
docs: 新增 12「从探索到产品模型的重构」
zyoncode Aug 27, 2026
1cb064a
feat(flows): S2a — 流程用图算法算出来,模型只负责命名
zyoncode Aug 27, 2026
6d642b7
feat(spec): S2b — 规格有了海拔,流程的路径是事实、名字是判断
zyoncode Aug 27, 2026
6b06d9d
feat(stories): S3 — 故事有了角色、价值与骨架位置;门禁认出「不是故事的故事」
zyoncode Aug 27, 2026
037650f
feat(eval): S4 — 结构覆盖率,分母来自产品本身
zyoncode Aug 27, 2026
38f3b9e
fix(review): 重写一条用例时带上它走的转移
zyoncode Aug 27, 2026
51090b4
docs: 12 跟上 S2–S4 的实测数字与两条实施教训
zyoncode Aug 27, 2026
c22c40c
fix(spec): compose 的输出预算从 3000 提到 6000;结构覆盖率接进评测接口
zyoncode Aug 27, 2026
5ffe50b
fix(stories): 故事的 token 预算跟上它变大的体量
zyoncode Aug 27, 2026
7ddc0da
fix(parse): 回复里不止一个 JSON 对象时,取合形状的那一个
zyoncode Aug 27, 2026
e286ae7
fix(parse): 模型返回裸数组时,套回它该在的那个键下面
zyoncode Aug 27, 2026
b093a5b
docs: 12 记下 S1–S4 全流程跑通后的对照
zyoncode Aug 27, 2026
5cec52d
feat(review): S5 — 故事地图,复核单位从「一条断言」变成「一条流程」
zyoncode Aug 27, 2026
44420cd
fix(covers): 规格里写出转移 id,用例才引用得了
zyoncode Aug 27, 2026
f3c3500
feat(benchmark): 撤下 SauceDemo,换成公开 AWGT 基准套件
zyoncode Aug 27, 2026
0a710b6
fix(eval): 自环不进结构覆盖率的分母
zyoncode Aug 27, 2026
f451414
feat(explore): 探索用环境配好的登录步骤,而不是猜;PetClinic 基准跑起来了
zyoncode Aug 27, 2026
724b8f3
fix(flows): 流程改成广度优先取最短路径;探索跳过 API 端点
zyoncode Aug 27, 2026
6fe65c2
fix(benchmark): 基准容器不带 --rm——它死的时候正是最需要日志的时候
zyoncode Aug 27, 2026
46eb53e
fix(sfg): 每一屏上看得见的链接都记成边——图不再是遍历的生成树
zyoncode Aug 27, 2026
6ce569c
fix(model): 网络层失败重试三次——别的一概不重试
zyoncode Aug 27, 2026
d9fd64e
test(benchmark): PetClinic 的黄金清单,13 条、4 条 heldOut
zyoncode Aug 27, 2026
7800523
fix(sfg): 退回上一屏之后,边的出发点也要跟着变
zyoncode Aug 27, 2026
877b253
docs: 12 记下 PetClinic 的第一份完整数据与两个发现
zyoncode Aug 27, 2026
1aec749
fix(benchmark): 只有 API 的应用不算基准;补一个界面丰富的现代 SPA 候选
zyoncode Aug 27, 2026
8302314
feat(explore): 做实验——故意把表单空着提交,去遍历走不到的那些状态
zyoncode Aug 27, 2026
429ce72
fix(benchmark): 基准应用固定 Accept-Language——消息随语言变的应用不算冻结
zyoncode Aug 27, 2026
2339559
fix(spec): 海拔要写进正文——下游读的是正文,不是结构化字段
zyoncode Aug 27, 2026
e816d48
docs: 12 记下补负例缺口的两步与结果
zyoncode Aug 27, 2026
a7a4542
docs: 13 顺序修正——先跨应用再配对评测,并记下换基准的目的其实还没兑现
zyoncode Aug 27, 2026
2d203a0
fix(explore): 单页应用的哈希路由是路由;运行声明的环境要真的传到浏览器
zyoncode Aug 27, 2026
711017b
fix(explore): 控件文案里的数字是数据不是结构——购物车角标不该炸出 11 个状态
zyoncode Aug 27, 2026
be0e63f
fix(explore): 同一屏上文案相同的控件是同一类——冗余会把没探索的部分吃掉
zyoncode Aug 27, 2026
88be40b
feat(explore): 结构同类自适应去重——先试代表,代表走不出去才跳过它的同类
zyoncode Aug 27, 2026
c2c0a16
feat(benchmark): 第二个基准应用真的跑起来了——OWASP Juice Shop,附实测黄金清单
zyoncode Aug 27, 2026
d3f811c
fix(stories): 故事图的骨架必须比躯干粗——七列里六列只有一个故事,那不是图
zyoncode Aug 27, 2026
ead8891
fix(stories): 挂不到流程的故事,活动名归一到模块——同一模块不该裂成两列
zyoncode Aug 28, 2026
11f5a94
docs: 14 两个应用各五次——第一份带误差棒的数据,并更正 §12 的一个说法
zyoncode Aug 28, 2026
3b1553d
feat(explore): 做实验按等价类分三档——空 / 格式非法 / 查不到
zyoncode Aug 28, 2026
17946f6
fix(explore): 实验把页面带走了要回来——一张表单三档,第一档就跳走的话后两档永远轮不到
zyoncode Aug 28, 2026
3610d3b
fix(explore): 实验的结果要进材料,哪怕它不算一个新状态
zyoncode Aug 28, 2026
d1251db
fix(explore): 结构同类每条路由最多点三次——40% 的预算花在了商品卡片上
zyoncode Aug 28, 2026
3c0f120
fix(explore): 链接的哈希路由也要留住——侧边栏里 Contact 和 About 全塌成了 `/`
zyoncode Aug 28, 2026
1dcc76f
feat(explore): 没去过的路由优先——预算受限时先要确定能带来新界面的那个动作
zyoncode Aug 28, 2026
495b989
fix(explore): 被测应用的边界要在到达时判——同源的地址可以重定向到任何地方
zyoncode Aug 28, 2026
6b7f3c2
feat(explore): 全局待访问队列——看见过但没走的地址不该丢
zyoncode Aug 28, 2026
d18df15
fix(explore): 待访问队列要排在点击之前,不是排在最后
zyoncode Aug 28, 2026
e25af87
fix(explore): 材料的字数预算按屏分——从尾巴切会整屏整屏地消失
zyoncode Aug 28, 2026
79be259
feat(explore): 没有 <form> 的输入框也能做实验——回车就是它的提交
zyoncode Aug 28, 2026
7810697
fix(explore): 匿名输入框不能丢——Juice Shop 的搜索框对探索根本不存在
zyoncode Aug 28, 2026
ce55fd4
fix(explore): 无表单输入框的实验要全局只做一次,且要求它真的能用
zyoncode Aug 28, 2026
2d9dae9
fix(explore): 无表单输入框用 fill 填,不手写 .value——Angular 的模型收不到手写的值
zyoncode Aug 28, 2026
ca0e441
fix(explore): fill/press 必须带超时——一句等待把整次探索挂死了 28 分钟
zyoncode Aug 28, 2026
ddb399b
docs: 15 补探索的触达与实验——十一个修复,以及一个还没兑现的度量
zyoncode Aug 28, 2026
a84623a
docs: 补上 PetClinic 的探索层结果——4/4
zyoncode Aug 28, 2026
13437b2
docs(benchmark): 把两个 PetClinic 在 id 上分开——petclinic-web 与 petclinic-rest
zyoncode Aug 28, 2026
9b3e985
feat(benchmark): 第三个基准应用——DimeShift,公开研究打的包,按 digest 钉死
zyoncode Aug 28, 2026
1ed9cd5
fix(explore): 直接访问打不开的地址要改成点它——第三个应用一上来就否掉了一条策略
zyoncode Aug 28, 2026
7665ad4
fix(explore): 别让回退把死页面捡回来——0 控件的页面不该进图
zyoncode Aug 28, 2026
32009f7
fix(explore): 结构同类去重不适用于带 href 的元素——整条导航栏被判成了一类
zyoncode Aug 28, 2026
4685e5e
fix(explore): 按钮类 <input> 的文案在 value 里——提交按钮对探索根本不存在
zyoncode Aug 28, 2026
03fa975
fix(explore): 兜底的查询框规则只认真正匿名的框——它在 dimeshift 上真的建了一条计划
zyoncode Aug 28, 2026
8cad985
docs: 16 第三个应用——留出集撞掉的是推理里的隐含前提,不是代码里的错
zyoncode Aug 28, 2026
0774752
chore(model): 切到阿里云百炼(DashScope)——qwen3.8-flash
zyoncode Aug 28, 2026
1b28cb2
fix(budget): 规格的输出预算按材料规模算——固定值已经错了第三次
zyoncode Aug 28, 2026
e71b433
fix(budget): 故事的输出预算给足——切断的代价是整批作废,要多了只是没用完
zyoncode Aug 28, 2026
c60a097
feat(model): 加 TP_MODEL_THINK 开关——「关掉思考会不会让产出变差」该测不该猜
zyoncode Aug 28, 2026
854a952
fix(model): 开着思考时把推理那份预算加回去——否则对照是不公平的
zyoncode Aug 28, 2026
20b00a8
fix(model): 用 thinking_budget 限推理长度,而不是把总预算 ×3
zyoncode Aug 28, 2026
30be250
fix(budget): 故事预算提到每条 2600——开着思考时模型写的故事更长
zyoncode Aug 28, 2026
102f2c0
feat(model): 被截断就加大预算重来——把手工常数从「正确性关键」降级成「只影响成本」
zyoncode Aug 28, 2026
5ab3e41
docs: 13 重新规划——先让度量可信,再谈提高
zyoncode Aug 28, 2026
915ef58
docs: 13 改写阶段 D——代码覆盖这条路前提不成立,验收对象是故事图不是覆盖率
zyoncode Aug 28, 2026
cb72b29
docs: 13 补阶段 F/G——文献只覆盖前三分之一,以及不需要源码的变异测试
zyoncode Aug 28, 2026
5a3c421
feat(review): 缺口成为故事图的一等公民——「缺了什么」此前在界面上根本不存在
zyoncode Aug 28, 2026
935c6a2
fix(spec+review): 模块名产不出来(schema 里没位置),以及缺口要去重
zyoncode Aug 28, 2026
7915a7d
fix(stories): 活动名钉成模块枚举——模型把整段规格正文抄成了故事图的列头
zyoncode Aug 28, 2026
0682809
fix(schema): JSON schema 要和 zod 说同一件事——空 steps 让八条故事全军覆没
zyoncode Aug 28, 2026
b0213c3
fix(gaps): 「看见没进去」以前报的全是假缺口——一个假缺口比没有缺口更糟
zyoncode Aug 28, 2026
0d9d7d8
fix(spec): 模块起不出名字是因为没给它信息——横轴上写着 owners / vets / oups
zyoncode Aug 28, 2026
15f5941
docs: 13 记执行——阶段 D 主体完成,阶段 A 卡在模型账户欠费
zyoncode Aug 28, 2026
e32612d
feat(benchmark): DimeShift 的黄金清单——12 条,4 条留出,全部浏览器实测
zyoncode Aug 28, 2026
f8b392c
docs: 13 阶段 A 完成——第一份可信基线,三应用各 5 次
zyoncode Aug 28, 2026
e8bcfee
fix(eval): 消融臂改成从原文里减——第一次跑的 design-methods 两臂差了不止一件事
zyoncode Aug 28, 2026
e711968
feat(eval): 把 design-methods 消融搬到有余量的应用上——原来那份撞在天花板上
zyoncode Aug 28, 2026
e06549b
docs: 13 阶段 B——「专业提示词值多少」目前的答案是「量不出来」
zyoncode Aug 28, 2026
e57562b
docs: 13 阶段 C——思考开关:覆盖率上看不出差别,但产出稳得多
zyoncode Aug 28, 2026
a989764
feat(model): 默认开思考——按方差选,不按覆盖率选
zyoncode Aug 28, 2026
76d3afa
fix(codegen): 判决归程序时不再写 aiAssert——模型被插在程序前面,可以否决它
zyoncode Aug 28, 2026
ac0cf7e
fix(gate②): 有机器判据时「代码里没有断言」不算缺陷——上一个修复把 38/40 条全拦住了
zyoncode Aug 28, 2026
8565b94
fix(runner): 别把 runner 硬接到一个可能没在跑的代理上——执行层一整天没连上模型
zyoncode Aug 28, 2026
ef69acb
feat(continue): 续跑可以覆盖参数——否则「整套跑一遍」在 API 上做不到
zyoncode Aug 28, 2026
5f3d715
chore(capability): model-proxy 不再自启动——它现在是反的,而且反复造成实际损害
zyoncode Aug 28, 2026
2a748ff
docs: 13 阶段 E 完成——流水线第一次跑到「用例真的执行并变绿」
zyoncode Aug 28, 2026
6ff4078
feat(mutate): 黑盒变异测试的算子表与注入脚本——从「说得出验什么」走到「真的验得住」
zyoncode Aug 29, 2026
2d0832d
feat(mutate): 变异体接进会话与执行——并且必须读回「它到底生效了没有」
zyoncode Aug 29, 2026
5326f67
feat(mutate): 变异得分的记分规则——「杀掉」是造成新失败,不是「有失败」
zyoncode Aug 29, 2026
edf7f7b
fix(mutate): 变异体的生效计数要在步骤跑完之后读——第一次实验因此什么都没测出来
zyoncode Aug 29, 2026
abc8664
fix(mutate): 变异体一直没装上——两条启动路径只写了一条,注入写法还试错了两次
zyoncode Aug 29, 2026
878c595
fix(mutate): 改文案要大小写不敏感——innerText 会套 CSS 变换,文本节点不会
zyoncode Aug 29, 2026
133945b
fix(mutate): 大小写不敏感 + 注入脚本里不能有反引号
zyoncode Aug 29, 2026
2c0dd59
docs: 13 阶段 G 起步——第一个变异得分 0.500
zyoncode Aug 29, 2026
ed5efe5
feat(gaps): 活下来的变异体接进故事图——第三类缺口「验不住」
zyoncode Aug 29, 2026
1a4840e
docs: 14 物料质量怎么衡量——每一种物料的学术方法论,以及我们差在哪
zyoncode Aug 29, 2026
3896133
feat(eval): 补上精确率——干净跑量虚报,变异跑量召回,并分清「判错」与「没走到」
zyoncode Aug 29, 2026
7149946
docs: 14 记补法①的执行结果——机制补上了,但基础太不稳,数还不能用
zyoncode Aug 29, 2026
f38bac7
feat(spec): 需求异味检测——查那些写法上就注定验不了的句子
zyoncode Aug 29, 2026
33ab977
feat(stories): 对照 QUS 补故事质量检查——并量出一个结构性事实
zyoncode Aug 29, 2026
582ac62
docs: 15 文献——只列真的用到、或真的该用而没用的
zyoncode Aug 29, 2026
7fc85b9
fix(mutate): 改文案的目标取自规则里引号括起来的界面文案,不是 evidence
zyoncode Aug 29, 2026
81221ab
fix(mutate): 变异体轮里有用例没跑成时判「不知道」,不判「活下来」
zyoncode Aug 29, 2026
6303eb1
docs(14): 记下变异实验撞上的模型下架事故,以及换执行器为什么不毁可比性
zyoncode Aug 29, 2026
7d9f421
fix(mutate): 检测评估的地面真值要跟变异算子对上,否则 relink 永远量不出来
zyoncode Aug 29, 2026
8ff718e
fix(bench): PetClinic 是有状态的,补上标记与冻结校验——它被写坏过一次
zyoncode Aug 29, 2026
1fc6c0d
docs(14): 补法② 的结论——变异得分 0.600(12 条子集,零模型调用)
zyoncode Aug 29, 2026
e61083b
fix(gaps): 变异缺口按「哪个缺陷」去重,不按「哪来的」——掉过一条盲区
zyoncode Aug 29, 2026
bddeafa
feat(ui): 画出状态流图,并让缺口能在图上定位
zyoncode Aug 29, 2026
75263f8
feat(ui): 运行进地址栏,`#/review/<id>` 可发链接;下拉与批次按时间认
zyoncode Aug 29, 2026
fd0251f
refactor(i18n): 清掉绕过 i18n 的硬编码中文,界面语言不再半中半英
zyoncode Aug 29, 2026
2c9dd90
feat(ui): 抽屉能一键展开,列宽跟着「在看什么」走
zyoncode Aug 29, 2026
0375c96
feat(ui): 需求追溯的空态说清楚自己为什么空
zyoncode Aug 29, 2026
3c91bf8
docs(spec): 把三席评审拆成 29 个任务,并写清怎么算改好了
zyoncode Aug 30, 2026
3f94df7
feat(ui): 产物只在一处决定怎么画,四要素与三段式一起补齐
zyoncode Aug 30, 2026
7dfcb2d
feat(ui): 队列能筛能搜,重试收成一组,假截图占位换成实话
zyoncode Aug 30, 2026
0f772da
fix(ui): 换卡不再丢运行,详情不再叠第三层抽屉
zyoncode Aug 30, 2026
a1c2fb9
feat: 把 covers / requirementId / activity 接回管道,两套账各带各的标签
zyoncode Aug 30, 2026
c3e07b0
feat: 节点参数有了表单,节点产物可折叠可搜不再截断
zyoncode Aug 30, 2026
0bd9e51
feat(gate): 补上两条提示词一直在要、却没人校验的规则;finding 改成结构化
zyoncode Aug 30, 2026
d5c88f7
feat(exec): 截图落库——存路径不存像素,那些 PNG 本来就已经在盘上了
zyoncode Aug 30, 2026
bd97a50
feat(prompt): 问模型要优先级和清理步骤——此前返回格式里根本没这两个键
zyoncode Aug 30, 2026
716649b
feat: 模块进导出目录、进产品地图;屏幕有了业务名(问模型要的)
zyoncode Aug 30, 2026
b7df98d
feat(project): 建项目时问一次「规格从哪来」,并让答案真的生效
zyoncode Aug 30, 2026
052ceb9
docs(spec): 回填 16 号规划的执行记录——28/29 落地,一件卡在预算上
zyoncode Aug 30, 2026
7efc945
chore(server): 加一个端点探针——分开问「活着吗」「能跑吗」「能看图吗」
zyoncode Aug 30, 2026
28a3e09
fix(probe): 别把「预算被思考吃掉」报成「不能看图」
zyoncode Aug 30, 2026
efe7188
docs(spec): 记下 runinfra 的三条实测事实——包括它自己的 modality 标签是错的
zyoncode Aug 30, 2026
a6158cf
fix(casegen): priority/postSteps 漏在约束解码的 schema 外,评测因此白跑一次
zyoncode Aug 30, 2026
0855376
fix(casegen): 光进 properties 不够——这个模型直接跳过可选键
zyoncode Aug 30, 2026
e48ba3f
eval(case-priority): 跑完了——A 更好但不显著,而我预判的推理是错的
zyoncode Aug 30, 2026
a92eb82
fix(stories): 换端点之后 plan.stories 塌成一条故事零条验收——可选键这个模型不写
zyoncode Aug 30, 2026
5d3f78e
fix(compose): flows / modules / screens 也进 required——同一条教训的第四次
zyoncode Aug 30, 2026
586bf79
docs(evals): 记下三次白跑——报告完全正常,产物是空的
zyoncode Aug 30, 2026
318a298
eval(case-priority): 修完管线重跑——覆盖率两臂相同,差别在「优先级有没有内容」
zyoncode Aug 30, 2026
0552c8e
eval(case-cleanup) + fix(gate): 因果是干净的,但我那条规则漏掉了登录
zyoncode Aug 30, 2026
0cb0bb2
docs(spec): 回填两条评测的结论,以及跑到它们之前废掉的三轮
zyoncode Aug 30, 2026
f579d6a
fix(evals): 变异注不进去时报 0 分——把工具自己的失败伪装成了用例集的盲区
zyoncode Aug 30, 2026
db23c34
feat(mutation): 建入口——在这之前变异那条路径是只读的
zyoncode Aug 30, 2026
d10bdc6
fix(mutation): 报告里写清「干净跑挂了几条」——读懂 0 分的第一个数字
zyoncode Aug 30, 2026
2457c9c
fix(mutation): 基线里的 infra 抖动重试一次——它的代价是「整场不上场」
zyoncode Aug 30, 2026
7a8c8a4
fix(wf): 重跑一个节点会把这次运行的目标地址擦掉——一次什么都没跑的运行报告说它成功了
zyoncode Aug 30, 2026
312358d
docs(spec): 回填第 3、4 项——截图通了,变异入口建好但这个端点测不出结果
zyoncode Aug 30, 2026
e9c174a
feat(export): 三层目录与动作复用——F-07 最后两条
zyoncode Aug 30, 2026
1cab2d9
feat(data): 测试数据工厂——导入、绑定、跑一行一个 test
zyoncode Aug 30, 2026
923ab0d
wip(v3): 2026-09-06 之前的全部未提交改动整体落盘
zyoncode Sep 7, 2026
e0e1dfc
wip(v3): 2026-09-07 以来的全部改动整体落盘
zyoncode Sep 14, 2026
fd1be27
fix(drift): 漂移检查漏掉了两个宿主 plugin,而红线正好指着漏的那一半
zyoncode Sep 14, 2026
0b663bc
fix(explore): 探索中途挂掉,已采到的屏不再全丢
zyoncode Sep 14, 2026
c0db361
test(claude-code): 宿主端到端第一次真跑通,并修好挡住它的那道人工闸
zyoncode Sep 14, 2026
699b1cb
test(claude-code): 真实站点走到 g2——宿主全流程的第二轮
zyoncode Sep 14, 2026
66b800e
test(claude-code): 补执行结果——10 条真跑测试网,9 过 1 败
zyoncode Sep 14, 2026
b2e3f2a
Merge pull request #1 from zyonlab/fix/drift-covers-host-plugins
zyonlab Sep 14, 2026
149b96a
Merge pull request #2 from zyonlab/fix/exploration-partial-progress
zyonlab Sep 14, 2026
1ccc0d7
fix(test): 「装没装 Penguin」这个探测自己不能炸,否则整个 server 包红
zyoncode Sep 14, 2026
0c5d716
Merge pull request #3 from zyonlab/test/claude-code-e2e
zyonlab Sep 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
38 changes: 38 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# 借 commerce-agents 的分层:无 API key 的检查跑在每次 PR 上;真跑模型的评测由人触发。
#
# 三件事:
# 1. typecheck + 各包单测(含 hook 子进程测试)——门禁类行为不过模型,脚本化输入就能钉住;
# 2. check-drift——两臂提示词的规则逐条认领,漂移即红;
# 3. replay——对仓库里冻结的运行重打分,coverage 必须和 expected.json 逐位相同。
# 这是「CI 只跑 replay、不打 API」:score_run 是确定性的,录制的运行在 benchmark/*/replay/ 里。
name: ci
on:
push:
branches: [main, v3]
pull_request:

jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
version: 9
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- name: typecheck
run: pnpm typecheck
- name: unit tests (packages)
run: pnpm test
- name: installer, fixture and gate contracts
run: node --test scripts/test/*.test.mjs
- name: hook tests (子进程,喂 stdin 断 stdout)
run: pnpm test:hooks
- name: prompt drift (两臂提示词逐条认领)
run: pnpm check:drift
- name: replay frozen runs (确定性重打分,不打 API)
run: node scripts/replay.mjs
40 changes: 40 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@ server/dist/
# runtime data — DB, encrypted secrets vault, settings, LLM-debug captures (SENSITIVE)
.data/
server/.data/
# 清库时旧数据是**移走**而不是删掉的(lineage 补不回来),备份目录同样带着密钥与整个库。
# 两种前缀都要挡:实测出现过 `.data.snapshot-*`,而当时的规则只写了 `.bak-`——
# 一个只挡住其中一种命名的规则,等于没挡:另一种照样会被 `git add -A` 收进去。
.data.bak-*/
server/.data.bak-*/
.data.snapshot-*/
server/.data.snapshot-*/

# Midscene run artifacts / caches / screenshots
midscene_run/
Expand All @@ -20,12 +27,45 @@ server/.wallets/
# env files (may contain model keys / RPC secrets)
.env
.env.*
!.env.example
server/.env
server/.env.*
!server/.env.example

# logs
*.log
npm-debug.log*

# Sanitized implementation evidence, intended for the next maintainer to reproduce.
!docs/v3/evidence/n-0[123456789]/*.log
!docs/v3/evidence/n-10/*.log
!docs/v3/evidence/n-11/*.log

# OS
.DS_Store

# A self-test runs a second instance of the product; its state is not this repo's.
.data-selftest/

# 测试自己的数据目录:不隔离的话,每次 pnpm test 都会往真实运行列表里塞十几条假运行
server/.data-test/

# replay 重打分的副产物(score_run 每次都把条目写回运行目录)
benchmark/*/replay/*/score.json

# Claude Code plugin 的本机配置与 hook 状态(生成物,含绝对路径)
plugins/testpilot-claude/tp-config.json
plugins/testpilot/hooks/.state/

# Sanitized remaining roadmap evidence
!docs/v3/evidence/n-1[2-9]/*.log
!docs/v3/evidence/n-2[0-7]/*.log
# Authoritative local evaluation store; export YAML/JSON evidence for review.
benchmark/**/*.sqlite
benchmark/**/*.sqlite-wal
benchmark/**/*.sqlite-shm

# 跑动证据留在本地。105MB、1100 多个文件,其中 6 个录屏就占 73MB——
# 进了 git 历史就只能靠 filter-repo + force push 才拿得掉。
# 结论、数字和引用写进 docs/v3/*.md,证据本体按需再单独归档。
docs/v3/evidence/
247 changes: 247 additions & 0 deletions .impeccable/critique/2026-09-02T06-48-01Z__src.md

Large diffs are not rendered by default.

65 changes: 65 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# TestPilot — 给 Claude Code 的接手说明

## 先做什么
- 2026-09-10 最新专业性要求先读 `docs/v3/20-领域专业物料链路诊断与重构交接.md` 和 `docs/v3/21-节点提示词与结构化契约草案.md`:先领域引导探索与产品模型,再故事/风险/文本用例/工程集成。当前只是诊断与方案,不能把原冒烟 10/10 当专业验收。
- 2026-09-10 最新用户决定:本地审核免身份验证。不要恢复 ReviewerSession / TP_REVIEW_TOKEN;操作来源与版本审计保留,详见 09 第 25 节。
0. **快速接手先读 `docs/v3/09-执行目标与接手指南.md`**:目的与边界、进度快照、设计取舍、N-01 起手式、交接记录格式。每次停止前按该文档 §6 留下可接续记录,并更新 §7 最近交接点。
1. 读 `docs/v3/00-架构.md`,先读顶部 **2026-09-08 用户决策补充**,再读 §8 红线、§13 规则在哪强制。Web 管项目/workflow/模型/物料/review;Penguin UI 管自进化评估。
2. 最新 Codex 原生复验见 `docs/v3/19-Codex宿主Hyperliquid实测.md`(10/10 通过;公共页面冒烟范围)。生产实施与真实验收再读 `docs/v3/18-本地UI重构与Hyperliquid验收.md`(Hyperliquid 15/16 通过,C-14 待审;P 项仍按剩余验收保持 doing)。当前 UI 的本地实施再读 `docs/v3/11-WebUI全流程评审与产品设计.md`、`docs/v3/13-UI与论文路线任务台账.md`,然后:
`node scripts/plan.mjs --doc docs/v3/13-UI与论文路线任务台账.md --next`
3. 认领 P 任务(同一 `--doc`,`--set P-xx doing`),按已有基础、代码落点和验收实施;全部兑现后再 done,证据写 `docs/v3/evidence/p-xx/`。当前优先 P-01;PC/SR 已合并到 P 台账。
4. 08 保留 N 系列历史及人工/观察/发布待条件项,07 保留 T 历史。旧完成率和旧 UI 迁移决策不能替代本轮验收。

## 判决必须在屏幕上(2026-09-12 用户决定)
- **这个项目产出的是端到端 UI 测试代码。一切基于界面:不要直接调用被测网站的接口。**
用例驱动产品的界面,再对界面上出现的东西下判断;接口说成功而屏幕上没有那一行,
用例会通过而产品其实是坏的。
- 已落地:`casegen/prompts.ts` 的第六种判据(`api`)整段改写成「判决从屏幕读」,
受限解码的 `kind` 枚举里去掉了 `api`(模型发不出来了);门禁新增 `oracle-offsite`
(warn,按 caseId 计分,等于挡住这类用例过关)。
- **旧口径的遗留物,别拿它们当范例**:`fixtures/hyperliquid-testnet/cases.json`(8/8 接口判据)、
`fixtures/tier4-demo/cases.json`(4/4)、`docs/v3/06-执行层降本.md`、
`fixtures/*/README.md` 里「判据全部是 kind: api」那套说法,都是这条口径之前写的。
- `exec/apiOracle.ts` 与 `MachineOracleSchema` 里的 `api` 分支**还在**(执行旧用例要用),
但新用例走不到那里了。要彻底拆掉是另一件事,没做。

## 被测地址只有一个口径(2026-09-12 用户决定)
- Hyperliquid 相关的一切跑动,**地址一律是 `https://app.hyperliquid-testnet.xyz/trade`**(测试网)。
本机链配置 `chainId 421614`(Arbitrum Sepolia)、`fixtures/hyperliquid-testnet/`、注入钱包用的账户,
说的都是这一条链。测试网上随便点是对的。
- **主网 `app.hyperliquid.xyz` 不作为被测对象**。同一个钱包在那边有真钱(2026-09-12 实测
`Portfolio Value $6.77`),同一串点击就是在花钱,而两者只差一个域名。它在 `guard.allowHosts`
里也永远不该出现——代码与测试里出现的主网地址是「不在白名单的那个例子」,别顺手改掉。
- 探索要点会改状态的东西(`exploreActions:"interact"`)时,服务端只认 `config.guard.allowHosts`。
测试网域名**已经在 `server/harness.config.ts` 的 allowHosts 里**(2026-09-07 加的,理由写在那儿),
所以不需要 `ALLOW_HOSTS` 环境变量——2026-09-12 实测:不给这个变量,测试网 interact 照样放行,
主网照样 403。要给别的域名开这个口子,走那份配置并在旁边写清理由。
- `fixtures/hyperliquid-mainnet/` 这个目录名是历史,里面的规则包对测试网同样适用(已实测)。

## 不做的事(除非用户当轮明说)
- 本会话用户已授权本地真实模型/浏览器联调,不需要再次索要 `.env` 或确认这类验收。新会话按其授权范围执行;不得把旧默认限制当成本会话的额外审批。`git commit` / `git push` / 对外发布仍未授权。
- 不改 `benchmark/*/gold.json`、`human-labels.json`、`held-out/`、`rubric/`;不把它们放进任何提示词。
- 不让自愈改 `oracle`。
- 动 `packages/harness-testing/src/casegen/prompts.ts` 或 `plugins/testpilot/skills/**` 时:`pnpm check:drift`(等价于 `node scripts/check-drift.mjs`)必须绿,`plugins/testpilot/plugin.json` 的 `skillVersions` 跳版本。
改完 skill 记得 `node scripts/build-claude-plugin.mjs` 与 `build-codex-plugin.mjs` 重新生成宿主副本——检查会拦,但拦住之前先想着它:2026-09-14 那次,改过的 skill 有四个文件整整两天没到宿主 agent 手里。

## 验收命令
```bash
pnpm typecheck && pnpm test # 各包 tsc + vitest + hook 子进程测试
pnpm check:drift # 两臂提示词逐条认领
node scripts/replay.mjs # 冻结运行确定性重打分
node scripts/cost-report.mjs # 每条用例的账(跑过用例之后)
```

## 目录速查
- `packages/harness-testing/` 九步节点、打分、变异、执行器(`exec/run.ts`)、接口判据(`exec/apiOracle.ts`)
- `packages/testpilot-mcp/` stdio MCP:run_pipeline · score_run · paired_eval · mutate_and_detect · drive_sut · retrieve_spec …
- `plugins/testpilot/` skills(纯数据)+ hooks(脚本);`hooks/lib/tp.mjs::deny` 记 holds
- `server/src/runtimes.ts` runtime 注册;`penguin.ts` / `claudecode.ts` 已有适配,`codex.ts` 原生适配已按 N-11 完成
- `benchmark/<capability>/` gold · human-labels · statement · rubric · held-out · scoreboard.yaml
- `server/src/evolution/` 与 `extensions/penguin-evaluation/`:配套评估 UI、固定预算沙箱、版本/CAS、只读冻结运行 release adapter
- `evals/*.json` 评测定义:两臂只差一件事,`expect` 跑之前写
- `fixtures/hyperliquid-testnet/` 执行层降本的被测对象(8 条 P0,全接口判据)

## 写作与提交信息的口径
中文;第一人称;先写失败与出乎意料的,再写改了什么;数字带来源。提交信息看 `git log` 的前 20 条照着写。
33 changes: 33 additions & 0 deletions Claude outputs/TestPilot_CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# TestPilot — 给 Claude Code 的接手说明

## 先做什么
1. 读 `docs/v3/00-架构.md`(唯一真相源,尤其 §8 红线、§13 规则在哪强制)。
2. 读 `docs/v3/07-第四档路线-任务与进度.md` §0,然后:
`node scripts/plan.mjs --doc docs/v3/07-第四档路线-任务与进度.md --next`
3. 认领一条(`--set T-xx doing`),做完验收判据再标 done,并在 07 §10 追加一行执行记录。

## 不做的事(除非用户当轮明说)
- 不调模型端点、不真跑浏览器、不 `git commit` / `git push`。这三件事要网络、费用或人的决定。
- 不改 `benchmark/*/gold.json`、`human-labels.json`、`held-out/`、`rubric/`;不把它们放进任何提示词。
- 不让自愈改 `oracle`。
- 动 `packages/harness-testing/src/casegen/prompts.ts` 或 `plugins/testpilot/skills/**` 时:`node scripts/check-drift.mjs` 必须绿,`plugins/testpilot/plugin.json` 的 `skillVersions` 跳版本。

## 验收命令
```bash
pnpm typecheck && pnpm test # 各包 tsc + vitest + hook 子进程测试
pnpm check:drift # 两臂提示词逐条认领
node scripts/replay.mjs # 冻结运行确定性重打分
node scripts/cost-report.mjs # 每条用例的账(跑过用例之后)
```

## 目录速查
- `packages/harness-testing/` 九步节点、打分、变异、执行器(`exec/run.ts`)、接口判据(`exec/apiOracle.ts`)
- `packages/testpilot-mcp/` stdio MCP:run_pipeline · score_run · paired_eval · mutate_and_detect · drive_sut · retrieve_spec …
- `plugins/testpilot/` skills(纯数据)+ hooks(脚本);`hooks/lib/tp.mjs::deny` 记 holds
- `server/src/penguin.ts` harness 接缝(四个函数);第二个运行时照它的形状写
- `benchmark/<capability>/` gold · human-labels · statement · rubric · held-out · scoreboard.yaml
- `evals/*.json` 评测定义:两臂只差一件事,`expect` 跑之前写
- `fixtures/hyperliquid-testnet/` 执行层降本的被测对象(8 条 P0,全接口判据)

## 写作与提交信息的口径
中文;第一人称;先写失败与出乎意料的,再写改了什么;数字带来源。提交信息看 `git log` 的前 20 条照着写。
Loading
Loading