Commit Graph

100 Commits

Author SHA1 Message Date
ThearchyHelios 384af7a5f2 界面跟上点名接入的新规矩:设置页标出已停用的接入、选不了别的停用接入,接入表变了画布重新校验,问题面板和修复预览不露键名
点名停用的接入以前照常调用,现在运行时照实报错,界面要提前说:
- 设置页门控、裁判、核查三格:存着的接入已停用和「不存在」一样在那一格下面写明后果;下拉里别的停用接入列着但选不了(只留已选着的那个);模型一格不再写「留空则使用」一个调不了的接入的默认模型。服务端按项拒收(422 带 field)时整句落到那一格下面、焦点移过去,保存条连同原因一起写,不再截掉「请在……中启用它」。
- 画布校验现在读接入表:编排页记下校验时的接入表签名(id、名称、启用与否),从设置里改完接入回来、或目录刷新后接入表变了,就重新校验一次,不再停着一句过时的「已停用」。
- 问题面板、修复预览里点名接入的字段写「模型接入」「成员「分析师」的模型接入」「工作流默认设置 · 模型」,不露 provider、model 键名;修复预览给列表项写名字。同一节点上自己的接入和成员的接入是两处问题,合并、找修复都连字段一起认,计数不再少算。

检查:check-publish 加点名接入的修复(一处一行、候选、预览、应用、390px 不溢出)、问题面板字段叫法、在设置里删了接入回到画布重新校验;check-manage 加设置页已停用接入的三格说明、选项、按项拒收;check-evidence 里全图默认的 model 改按「模型」核对(不借裁判叫法的原意不变)。
2026-10-06 15:14:40 +08:00
ThearchyHelios cc166fefb8 合入期 4 审批质询(前端):报告句末与划选原文浮出「质询」,问答串与提问框挂在审批卡和运行详情,回答按片段与出处渲染;同一张卡挂两处、换了审批、报告改写前的问答各归其位;时间线解读 approval.inquiry,等待中来质询阶段仍是等待 2026-10-06 11:32:20 +08:00
ThearchyHelios c549b15150 合入期 4 期 3 收尾:核查缺口分「核查未通过」「核查未完成」两组,时间线认得核查类日志代码;双盲复算写目录的预告和真写逐字一致(被目录挡下的那一边也说清原因,几个指标落到同一项时按组合预告);反方审稿说清「根本没反查」和「到底降不降档」;字段叫法挪到 labels.py;记录页的核查工件有名字和说明 2026-10-06 11:31:11 +08:00
ThearchyHelios bef11d76ca 合入期 4 证据面板核查状态与打磨:证据接口带上双盲复算、反方审稿的状态,指标步骤里遮罩列的输入只写「已遮罩」;可验证报告里输入取自遮罩列的口径卡只给 id;推演与口径卡共用取整;运行对比离开后晚到的答复不再跳走 2026-10-06 11:31:02 +08:00
ThearchyHelios eb71513924 审批质询(前端)复核整改(第 1 轮):同一张卡挂两处、换了审批、报告改写前的问答各归其位,句末入口不再挤动正文
- 提问框记下打开它的那一处(host)和那张审批:画布的审批浮层和右栏同时挂着同一张卡时,提问框只画在点的那一处,焦点不跳到另一处;另一处写明「提问框已在另一处打开」,可「在这里继续」;浮层关了由右栏接过去,不抢焦点。换了审批(同一份报告的下一级审批、驳回改写后再审)旧的提问框不再显示,提交一律带页面此刻的审批 id,不会再拿旧 id 一直 409
- 问答串按每条问的是哪一稿报告分开:别的审批里问的,按审批列表里那张审批审的文档对一下,对上了才按句子编号挂;改写前的、对不上的单独一组「报告其他版本上的质询」,不拿当前报告同编号的句子当抬头,回答里引用报告出处的数也不去当前这一稿里找。运行详情同理(封存之后问的认封存的那一稿)
- 句末的「质询」改成固定宽度的淡色图标,悬停、聚焦只换颜色和描边,不再从宽 0 撑开:后文不右移、表格列不跳;表格格子不挂(问表里的数划选或就整份报告提问)
- Esc、「取消」之后焦点回到那一句的「质询」并滚回视野(页面和限高的报告框都滚)
- 回答期间另开的提问框不再被失败的那一条覆盖:失败的问题和原因挂在原来那一句下面,提问框关着时可以放回提问框重问
- 写进运行记录后:画布正显示这次运行、流已收尾时按已有的最大序号补接一次;运行详情补拉一次事件(pages/runs/useRunDetail.ts 订阅一个计数)。时间线因此出现「审批人质询」
- 运行详情对所有运行只读列出已有问答(正式运行审批时问过的随运行封存,审批处理后也看得到查过的 SQL、行数、快照),入口仍只给封存了的探索运行;设置里关了审批质询就不给入口,已有问答照列并写明已关闭
- 小项:读屏连续两次回答都播报;「已等待 N 秒」挪出播报区;花费照 runCostText 写(估不出不写 $0);查询列表收着时也写有几次被截断;报告没有逐段证据时提示只说可以就整份报告提问;列表取回来之前不出「还没有问答」的提示;回答里核对不了的名称、猜测的来源照报告的线型画;回答期间批准 / 驳回下面那句原因在浅色主题下对比度够了
- RunPanel 改传这张卡的审批 id 和是否待处理(处理过的卡也认得哪几条问的是卡上这一稿);check-all 里 check-inquiry 的预计时长按实测改成 60 秒
- check-inquiry 补上各项:悬停前后正文和表格不移位、焦点回去后在视野里、同一张卡挂两处、先后两张审批、改写前的问答单独一组、失败不覆盖新写的、连续播报、花费、截断、无文档、设置关闭、遮罩原值不外露(含导出的 CSV)、补接事件流;新增预览用例 inquiry-approval-twice / -steps / -steps-same / -nodoc
2026-10-06 09:57:34 +08:00
ThearchyHelios 4c3ba8bc1b 期 4 复核修正(第 1 轮,前端):核查缺口分「核查未通过」「核查未完成」两组并补上证据页、印章的检查,写目录预告推断时算上被挡下的同项指标,反方审稿概况的说法与排布改准
- 出具缺口:双盲复算的「指标无法复算」是没核成,不再和两路不一致、结论被推翻一起叫「核查未通过」——splitIssuanceGaps 分成 failed「核查未通过」、unfinished「核查未完成」两组,时间线那一行、证据页、成果节点印章的悬停说明都按先未通过、再未完成、最后校验不完整排。check-decode 按服务端 GAP_* 和 _refuted_gap 的原话加出具契约的前缀拼出缺口再分组,服务端改了说法先变红;新预览用例 verify-gaps 画真的 EvidencePane 和成果节点卡片,check-verify 断言两组各列各的、横幅的「校验未全部完成」里没有它们、印章说明的先后,以及 390px 深浅色不溢出、可读(以前去掉这两处的实现所有检查照样全绿)
- 时间线:无法复算那一行只说「已记为缺口」,不再一律说「按缺口计入出具」(探索运行不出具,接在侧枝上的缺口进不了出具);dual_check_catalog 带值的写法补上检查,和审批卡「会记为」用同一个函数、一字不差
- 双盲复算审批卡:工件里没有合并预告时(老工件、组合超上限、还没取到),被目录挡下、带着写到哪的同项指标也算进来——业务日期、去重规则说法不同就说都不记(服务端先归拢、轮不到对目录),有效记录条件同项上有被挡下的只说可能记、也可能不记;推出来的条目标 data-inferred,结尾换成「实际写入以时间线上的记录为准」。check-verify 用新夹具 time_rejected 断言销售额不再说「会记为」
- 反方审稿审批卡:「没能」改「未能」,提示不再说「没有真正查询数据」(触顶的查过),原因补上报告未引用数据库查询,时间线的下一步不再建议调高上限(这一条不含触顶的);「N 句未能反查」挪到降档说明后面,不再插在「出具会降档」标记和它的说明中间,句数不超过「无法判断」;不在出具路径上的那句写明是反方审稿节点(审批卡上的「本节点」读着像审批节点)。ChallengeSummary 收 runClass,给了就照它、不另取;check-challenge 的夹具改成和服务端约定一致(未能反查 2 句、无法判断 3 句),另断言给了运行类别时另取失败也照样写降档、不发请求
2026-10-06 09:31:28 +08:00
ThearchyHelios 6e30e2fcd6 证据面板复核整改:反方审稿的概况照实、不预告出具,点句中的数字也看得到;双盲复算写明报告里的数没换、已记为缺口
反方审稿:那一块复用审批卡的展示(只读 ChallengeSummary 的导出),概况改用服务端给的整份报告的计数,不再凭这一句拼出「被推翻
1 句、其余 0 句」;不给它运行 id,就不再写「出具会降档」「本次正式运行将降档出具」这类审批时的将来时预告——运行已经结束,降没
降档看报告的出具横幅(驳回、不予出具、反方审稿不在成果节点上游时那句预告都是错的)。没给计数的判断不画。片段面板(点句中的
数字)同样画这一块:没开结论句裁判的报告没有句末徽标,以前被审过的句子在正文里无处可看。

双盲复算一行:状态词换成时间线上的说法(与盲算结果一致 / 不一致、未能完成),和同一节里按代入式重算的「复算一致 / 无法复算」
分开;标签悬停、读屏说明是什么(另起一路独立计算)。审核人的选择照审批卡的选项原名写(审核人选择「采用盲算的结果」),选了
盲算、两边都不对、没选的写明「报告中的数仍取自原流程,这个指标已记为出具缺口」(探索运行写缺口),未能完成的同样写已记为缺口;
跳过的原因按指标说(节点或设置中已关闭 / 这个指标没有来自查询的输入 / 不在复算范围内),认不出的原因代码不写进句子,标签不再
说两遍「双盲复算」。

遮没遮核对不了的输入(快照读不出来)和遮罩列一样写「已遮罩」,悬停、输入来源里写明原因,不算进底下的遮罩列。

check-evidence:六种状态的文字和颜色、标签说明、和「复算」分得开、第二轮的几种跳过原因和「两边都不对」;正式运行写出具缺口;
整句面板的计数等于服务端给的、没有出具预告的几行、被削弱的那一句不出现「被推翻 0 句」;片段面板、没开裁判的报告点数字看得到
判断;没给计数的不画;核对不了的输入。把计数改回拼的、给回运行 id、片段面板不画、去掉后果那句,对应各项变红。
2026-10-06 09:20:29 +08:00
ThearchyHelios 5e8d2c9c36 定时任务自动对比复核整改(前端):页头的定时任务链接在窄窗口里不再被挤没、带日历图标、任务删了写纯文本;触发历史的对比入口改叫「与上一次对比」并写出有几个指标有变化
- 运行详情页头:元信息这一行改成可换行,定时任务链接至少留 7 个字宽。以前这一行不换行、只有链接能缩,820 宽的探索
  运行只剩「由…」,768 宽为 0,Tab 停在看不见的链接上,「2 条事件」被压成竖排。链接前加和「定时」标记一样的日历
  图标,平时看得出能点。取回的定时任务列表里没有这个任务(已删除)时写成纯文本「由定时任务「X」发起(已删除)」,
  不再链到「不存在」页;列表取不到时不算删除
- 触发历史:「对比上一次」改成和运行详情「更多」菜单同一个叫法「与上一次对比」(复用 RUN_COMPARE_TEXT.menu),旁边
  写「N 个指标有变化」,触屏和键盘也看得到变化的规模,悬停照旧写各类个数。基准不是紧挨着的上一次(服务端给
  previous: false)时悬停写明是哪一次,也不再带「默认基准:同一定时任务的上一次运行」的来历
- 「通知中的运行链接」改成「通知中的链接」,说明里写清对比页链接也靠这个地址
- check-schedules:对比入口的叫法、计数、previous 为 false 时的悬停和来历;页头链接在 768、820 宽(含「提取为草稿」
  的探索运行、署名的立即运行)写得下「由定时任务」且「条事件」不竖排、Tab 到时看得见;图标;定时任务删除后的纯文本
  和列表取不到时照旧是链接;390 宽深浅色下计数在屏幕里、对比度够
2026-10-06 08:49:10 +08:00
ThearchyHelios b0cf23ddda 双盲复算审批卡的写目录预告和服务端逐字一致,盲算的理由按理由文档画(前端)
- 预告逐条说:会写的说「哪张表的哪一项会记为……」,不写的照服务端的原话说「不会记入:原因」(和裁决后时间线上跳过的原因一字不差),不再只有一句「不记」看不出为什么。三条分行列出,原因再长窄屏也不撑宽
- 被目录挡下的一边(已确认、驳回过、和已有条件合不起来)服务端照样带着写到哪,卡上据此认出几个指标是不是落到同一项上
- 同一次裁决里几个指标按当前的选择落到同一项上时,照完整对照里服务端算好的合并预告(catalog_joint)说:会写的是合起来的值、写明和哪几个指标一起记入,不写的照原因说;选择一变跟着换成那一组合的结果。工件里没有(老服务端、组合太多、工件还没取到)或认不出时,回到按其余指标当前的选择有条件地推
- 盲算的理由:对照工件带了 rationale_doc(核查 agent 组装、裸数字已标出)时按文档画,和反方审稿的理由同一种画法:有出处的数字画实线、挂盲算自己的查询编号,裸数字画点状线、挂「无证据」,下面再醒目地说一句;老工件只有正文,照旧纯文本
- 夹具 dual_check.json 补 catalog_blocked(目录里已有人工确认的业务日期时的真实预告)、merges 各组合的 catalog 与 joint(服务端按那一组合的目录算的真实输出)、filters_rejected(驳回过的条件),盲算理由换成 compose_doc 的真实输出;test_dual_check_fixture 核对预告与服务端一字不差、joint 里按选择取出的那一条就是真写的结果
- check-verify 补三节:被目录挡下的一边、照合并预告说并和真写核对、合并预告认不出时回退;理由文档的实线、裸数字、提醒和老工件的纯文本
- dual_check_facts._write 的返回标注改成和 _record 一致(写进去的说法或 None)
2026-10-06 08:11:02 +08:00
ThearchyHelios f8adbaa463 核查类节点检查器的通用控件合成一份:选画布节点、三态开关、核查模型选择只留在 verifyFields.tsx
期 3 两个工作包各写了一份:双盲复算在 DualCheckFields.tsx(选口径卡、启用三态、盲算模型),反方审稿在 verifyFields.tsx(选报告、启用三态、反方模型),说法和细节各不相同、修一处漏一处。现在双盲复算改用 verifyFields 的 NodePick、TriState、ProviderPick、ModelInput,只给自己的文案;它特有的选指标、口径说明、相对误差留在 DualCheckFields.tsx。写进配置的值不变(留空写回 undefined,三态只认真布尔)。

- NodePick 加可选的分组(上游的一组、画布上其余同类的一组,选了不在上游的照样能选、下面提醒连到上游)、下拉项和缺省名的写法;写着的卡被删了、写的不是口径卡(助手改图、导入 JSON 会写出这种配置)时双盲复算也照实列出、说一句,不再只认「不在画布上」
- TriState 可选在「跟随设置」后面写出设置里现在是开是关(双盲复算用,每次打开检查器重取设置);设置的取法 useVerifyDefaults 挪到这里共用,用不上的控件不发请求
- 画布节点、连线的类型收窄成两边都给得出的 CanvasNode、CanvasEdge,节点卡片摘要和检查器共用 upstreamOf、resolvePick
- check-verify 跟着改:提示、三态、按模型名找接入的标记换成共用控件的;字段叫法从 engine/labels.py 读(期 4 从 schema.py 挪过去);补写着的卡不在画布上、不是口径卡两种情形
2026-10-06 08:10:10 +08:00
ThearchyHelios 20c24fcf8c 反方审稿审批卡说清「根本没反查」和「到底降不降档」,运行类别取不到时不说出具(前端)
- 服务端给了 unreviewed(核查模型不可用、触顶、数据源不在了等没能反查的句数)就另起一行「N 句没能反查,已记为无法判断」:这几句混在「无法判断」里,分不出是查了数据不够还是一条都没查
- 「出具会降档」只在正式运行、有被推翻的结论、服务端的 degrades 为真时写(老服务端没给时照旧按「不是只标注」算);按降档处置却不在带出具契约的成果节点上游的,说一句为什么不影响出具档位,不再让审核人以为会降档
- 运行类别取不到时一句和出具有关的话都不说:以前写「暂时无法确认运行类别;如为正式运行……会降档」外加重试,卡顶却按审批自带的运行类别写着正式运行,两处打架。窗口重新拿到焦点时照旧再取,取到正式运行后降档提示才出现
- 理由文档的画法(RationaleDoc)导出给双盲复算的审批卡用:没给跳转时有出处的数字不是按钮,只画实线、挂查询编号、读屏念出处
- 检查器帮助里「结论被推翻时」的选项名照下拉写(出具降档 / 只标注 / 报错并停止运行),和服务端报错里点的名字一致
- 预览用例补没能反查、不在出具路径上两种;check-challenge 补这两段、改写取不到运行类别那一段,并新增一节逐项比对 engine/labels.py 的 CHALLENGE_LABEL、CHALLENGE_ON_REFUTED_LABEL 和检查器的字段名、下拉选项
2026-10-06 07:53:47 +08:00
ThearchyHelios e35d19d014 出具缺口里核查报上来的另起一组「核查未通过」,时间线认得期 3 留下的三个核查日志代码(前端)
- 时间线的出具那一行、成果节点卡片的出具印章、证据页的出具横幅:双盲复算、反方审稿报上来的缺口(「双盲复算「节点名」:」「反方审稿:」开头,按节点类型的前缀认,名字里带这几个字的别的节点不算)归在「核查未通过」下,不再和「校验不完整」混在一起——它们是核查查出来的问题(两路结果不一致、结论被推翻、指标无法复算),不是校验没做完。分组只有 run/decode.ts 的 splitIssuanceGaps 一处,三个地方共用
- 时间线解读 dual_check_unchecked(哪几个指标无法复算、各自的原因)、challenge_unreviewed(几句没能反查、第一句的原因)、challenge_sources_lost(几句只查了部分数据源、没查成的源):以前认不得,只能照原话显示;记入数据目录那一行带上写进去的值,写法同审批卡的预告
- 反方审稿的时间线文案从 DUAL_CHECK_TEXT.challengeLog 挪到 CHALLENGE_TEXT.log(各节点的文案放在各自的块里),decode.ts 跟着改引用
- 工件种类叫法补上 dual_check(双盲复算对照)、challenge(反方审稿记录),工件列表不再显示键名
- check-decode 补一节:三个日志代码、出具缺口的分组和顺序、前缀不重复节点类型、缺字段的老日志不崩
2026-10-06 07:53:18 +08:00
ThearchyHelios 35ec307baf 运行对比前端打磨:离开运行详情后晚到的答复不再跳走,下一步只指向真走得通的路
查找基准期间离开运行详情:以前只靠组件卸载时取消请求。路由按过渡渲染换页,地址已经换了、新页面还没画出来的那一下
答复回来,组件还在、请求也没取消,照样把人拽到对比页。现在答复回来时再比一次地址(只比路径,换视图、改筛选不算离开),
人已经不在点菜单时的那个运行详情上就不跳,找不到基准时也不弹提示。

换基准的下一步:409、422、缺基准的 404、找不到默认基准,都先看下拉里有没有能换的运行(已封存、不是本次、也不是当前的
基准,409 时出问题的可能正是它),没有就照实说没有其他可换作基准的已封存运行,不再叫人去上方选;还不知道时先不说。
本次的运行记录不存在时,换基准的位置只说列不出同一工作流的运行,不给重试几次都一样的「重试」。

check-compare:「离开之后答复才回来」改成去定时任务列表(进去之后不再自己换地址,/data 会再换成 /data/databases,
晚到的跳转能被盖住),等那一页落定、运行详情卸下再放行,断言走过的地址里从没出现过对比页;另加「立刻放行」:只换地址、
先不通知路由,把空当撑住再放行,找到基准的不跳、找不到的不弹提示。再加下拉里没有能换的运行时 409、422、缺基准 404 的
下一步,和本次记录不存在时换基准的位置不给重试。去掉实现后这些检查各自变红(两轮,共 8 项)。
2026-10-06 07:44:49 +08:00
ThearchyHelios ddc95ccbad 证据面板显示核查状态:指标步骤的双盲复算一行,整句的反方审稿判断,遮罩列的输入只写「已遮罩」
指标步骤多一行双盲复算的结果:一致(带盲算值)、不一致(带盲算值和审核人选了什么,没选的照实说)、无法复算(带原因)、
已跳过(关闭了、口径卡上没有来自查询的输入、这个指标不在复算范围内)。结果都写成字,颜色只表达要不要多看一眼。
点开一整句时,反方审稿的判断复用审批卡上的展示(run/ChallengeSummary,只读它的导出),只列这一句,点开看反方的理由和查询。
取自遮罩列的输入,标签照查询表格里遮罩格的样子写「已遮罩」,输入来源里核对不一致时只说不一致、不写两边的值。
接口字段的类型就近写在面板里,不动 types.ts;界面文案放 EVIDENCE_TEXT。

check-evidence 加一节:六种双盲状态的文字和颜色、深浅色对比度、没复核过的不画;遮罩输入的标签、代入式、遮罩说明、输入来源;
整句面板的反方审稿判断、降档说明、点开取审稿记录看理由、没审到的句子不画、390px 不横向溢出。
2026-10-05 19:15:14 +08:00
ThearchyHelios 3dd5216af2 审批质询(前端):报告上的入口、问答串与提问框、回答渲染,审批卡与运行详情的挂法,check-inquiry 换成真检查
- run/Inquiry.tsx:质询的 store(列表按运行与报告缓存、一次运行同一时刻只有一条在回答、请求不随组件卸载作废)、ReportInquiry(问答按句子归拢、同一句下按时间排,进入时按列表接口恢复;就整份报告提问;正在回答的那一条)、提问框(显示被问的那句或划选的原文,Esc 关掉、焦点回到点开它的「质询」,Ctrl+回车提交,字数上限 1000、原文 500,409/422 照服务端的中文说明显示、问题留着)、回答渲染(数字的出处同报告:质询自己的查询点开按质询工件接口取快照、标出那一格;引用报告已有出处的交给页面在报告里打开证据面板;裸数字点状线)、查询列表(SQL、行数、截断、遮罩)、recorded 为假时醒目说明
- EvidenceDoc.tsx 只加入口:父组件传入 inquiry(是否可问与 approval_id)。每句结论后的「质询」平时宽 0、透明,悬停或焦点在这一句上时出现,只在焦点在这一句上时进 Tab 顺序,整份报告不多出一串 Tab 位;没有可点内容的句子,「质询」本身进方向键的顺序;触屏一直显示。划选原文浮出「质询」,原文按选区克隆、去掉徽标和小标签,证据面板里的字不算
- ApprovalReport.tsx:报告核对概况下面挂问答串,逐段证据带上入口;回答里引用报告已有出处时展开逐段证据、在那一处打开证据面板
- 文件所有权之外的两处最小改动(交付说明里写明):RunPanel.tsx 把待处理审批的 id 传给 ApprovalReports,回答期间批准 / 驳回停用并说明原因;pages/runs/EvidencePane.tsx 对封存了的探索运行给入口并挂问答串(判断用 Inquiry.tsx 导出的 inquiryOpen),正式运行不给
- 预览用例 dev/fixtures/inquiry.tsx 与夹具 inquiry.json(报告文档、回答文档由后端 build_catalog + compose_doc 真实组装,虚构数据);check-inquiry.mjs 用 page.route 假接口逐项断言入口、请求体、回答期间停用、问答串恢复、数字取质询工件、报告出处、recorded 为假、409/422、已处理审批与正式运行封存后无入口、390px 与深浅色
2026-10-05 19:13:07 +08:00
ThearchyHelios 863b0b2894 定时任务前端:触发历史加「对比上一次」,运行详情页头的「由定时任务「X」发起」改成键盘可达的链接
- 触发历史:服务端给了 compare 的那次触发,在运行链接前加「对比上一次」,链到对比页(本次是这次触发的运行、
  基准是服务端自动对比时取的同一任务上一次),带上来历让对比页写「默认基准:同一定时任务的上一次运行」。悬停写
  各类指标的个数,和 Webhook 通知那一行同一个写法(三类总写、其余有才写、两边都没有指标时不写一串 0 个),读屏
  当说明念;只有个数。compare 为 null、老服务端不给时不显示
- 运行详情页头:定时任务发起的运行,「谁发起的」那一段换成到 /schedules/:id 的真链接(Tab 到得了、回车能开,
  有焦点环)。到点发起的(署名是「定时任务:X」)整句换成「由定时任务「X」发起」,不再写两遍;有人署名点了
  立即运行的,署名照写、后面接「来自定时任务「X」」。名字取定时任务现在的名字,取不到用署名里记的;长名字截断,
  全名在悬停里。记录页「定时」标记的说明同步改成指向这里
- types.ts 定时任务那一段加 ScheduleFireCompare 和 ScheduleFire.compare;文案进 SCHEDULE_TEXT
- check-schedules:触发历史的对比链接(地址、悬停的计数、只在有 compare 的行出现、Tab 到得了、回车打开对比页)、
  运行详情页头的链接(现在的名字、真链接、不重复署名、Tab 到得了且有焦点环、回车去定时任务、署名的立即运行、
  手动运行没有、长名字截断不撑宽、浅色可读),390px 深浅色下对比链接在屏幕里、看得清
2026-10-05 18:58:25 +08:00
ThearchyHelios 23cdc986fc 审批质询(前端)第一步:质询的类型与接口、时间线解读 approval.inquiry
- types.ts 末尾按前后端约定加 Inquiry、InquiryRequest/Response、查询与快照的类型,字段名一个不改
- api/inquiry.ts:提问(POST,不设超时,服务端自有时长上限)、列出问答、取质询引用过的查询快照(外层包不包一层都交给界面认)
- decode.ts:approval.inquiry 不再落进「未识别的事件」,解读成顶层一行「审批人质询」:标题带问题前 40 字,副标题说回答完成 / 不完整(写明哪个上限)/ 未能回答、查了几次,封存之后问的写明封存后追加;缺字段、类型不对的照实少说,不拿 0 顶查询次数
- check-decode 断言上述说法与缺字段的兜底;check-trace 加「运行停在审批时来了一条质询,相位仍是等待」:等待段不被收掉、执行时长不涨、恢复后照常跑完、每个前缀上 trace 与 decodePhase 一致
2026-10-05 18:46:03 +08:00
ThearchyHelios 14dcbe19bb 合入期 3 反方审稿(前端):审批卡与证据里的反方审稿概况、逐句判断与理由、检查器
# Conflicts:
#	frontend/src/canvas/nodeDefs.ts
#	frontend/src/types.ts
2026-10-05 18:10:06 +08:00
ThearchyHelios bcad199e0f 双盲复算前端复核修正(第 3 轮):同一次裁决里几个指标落到数据目录的同一项上时,卡上按其余指标当前的选择说——说法不同的改说都不记,有效记录条件说合成一句
问题:服务端写目录前把同一次裁决里落到同一张表同一项上的说法归拢(dual_check_facts._merged):业务日期、去重规则只要说法不同就一项都不写,有效记录条件用 AND 合成一句写。审批卡上的预告是每个指标单独算的,卡上不看别的指标选了什么:一个指标采用原流程(paid_at)、另一个采用盲算(created_at),两块里各自加粗说「记为……」,服务端一项都不写;两个指标都采用去重的一边、去重的列不同,也是这样。结尾只说按发起审批时的数据目录预告,看不出选择的组合也会让写入作废。审核人可能为了不让同一张表出现两个业务日期,把本该分开的选择改成一致。

审批卡(run/DualCheckApproval.tsx)
- 按其余指标当前的选择,给每个指标的两种选择各找出落到同一数据源、同一张表、同一项上的指标(peersOf)。只看预告会写的一边:选「两边都不对」、还没选的,服务端不会并进来。说法照服务端的 _same_fact 比:业务日期只看哪一列,其余压掉多余的空白比。
- 业务日期、去重规则说法不同时,那一句改说「……与「退款率」的选择说法不同,都不记」,不再算作会写。有效记录条件在「记为……」后面补一句「与「退款率」采用的条件用 AND 合成一句」。
- 选择一变,各块的说法跟着变。没选中的那几句也按别的指标当前的选择说,审核人改选之前就看得出这一选会不会让整项作废。
- 结尾改成「写入的项记为人工确认的事实;以上按发起审批时的数据目录和各指标当前的选择预告……」。原来是「两边都不对时不记。记为人工确认的事实」,读起来像在说不记的那一项。
- 没有预告时的结尾同样改。时间列、去重两句补上「同一次裁决里几个指标给同一张表记的业务日期(去重规则)不同时都不记」。

夹具与检查
- 夹具加 peers 和 merges。peers 换掉「退款率」对不上的那个输入,和「销售额」落到 orders 的业务日期、去重规则、有效记录条件上。merges 是四种组合:业务日期分开选、选同一列、去重的列不同、有效记录条件不同。
- peers 的差异说明和预告是服务端的真实输出。merges 的 written 是 record_choices 在空目录上真写一遍的结果。
- test_dual_check_fixture.py 新增两项。一项不依赖服务端,查每种组合真的落到同一项上。另一项在服务端合入后建临时数据源真写一遍,逐项比对。
- 在 vs/f1a 的 f7d1a2e 和 233afd1 上都跑过:8 项全过,regenerate 逐字节不变。
- 预览用例 dual-check-approval 认 peer 参数。
- check-verify 新增一节:
  - 分开选时,两边加粗的那一句都说都不记,写明哪张表的哪一项、和哪个指标说法不同。
  - 没选中的那一句按别的指标当前的选择说;一个指标改选两边都不对后,另一个回到「记为」。
  - 选同一列照常记;去重的列不同都不记;有效记录条件说合成一句。
  - 390px 下深浅色都不横向溢出。
- check-verify 没有预告的一节补两项:「人工确认」说的是写入的项;说法不同时都不记。
- 变红验证:去掉实现(peersOf 返回空),check-verify 变红 6 项;把有效记录条件也当成说法不同,变红 1 项;把还没选、两边都不对也当成采用了一边,变红 2 项。
- 改动后 297 项全部通过(原来 274 项)。check-all 里 check-verify 的耗时估计按实测改成 71 秒。
2026-10-05 17:47:21 +08:00
ThearchyHelios b206665856 双盲复算前端复核修正(第 2 轮):「记入数据目录」不再说得比服务端宽——有服务端预告时照预告说,没有时只说必要条件、不写的几种照实说
问题:审批卡上那句「记入数据目录」的提示是照 vs/f1a 早先的规则写的。F1a 在 1491b5c 把写目录的规则收紧以后,有三种常见情况卡上说会记入,服务端却都不写:
- 只有一边按时间筛:卡上写「两边只差在按哪一列筛时间」,和正上方那条差异「盲算没有按时间筛选」自相矛盾
- 只多一个指标自己范围的条件(channel = 'web'):服务端只把排除退款、作废、测试这类无效记录的条件记成有效记录条件
- 只差去不去重,而审核人采用的是不去重的一边:服务端不写
审核人可能为了不让目录被写错,避开本来正确的原流程,结果出具降档;节点设为「判为失败」时运行还会终止。

审批卡(run/DualCheckApproval.tsx)
- 服务端在摘要里另带预告(payload.summary[].catalog,F1a 在 f7d1a2e 加的,约定之外另带)时照它说:三个选择各说一句,会写的写明哪张表的哪一项记成什么,不写的写「不记」。两边都不写就不提数据目录。审核人当前选中的那一句加重,选完一眼就能看出这一选会写什么。预告跟着摘要一起来,完整对照还没到或取不到时也照样能说。预告的形状认不出时整份不用,回到有条件的说法。
- 没有预告时(老服务端、升级前挂起的审批),三句改成只说必要条件(「仅当……才」),并把不写的几种照实写出来:只有一边按时间筛时不记;多出的条件得只在一边、并且是在排除无效记录,只看某个地区、某个渠道这类条件不记;采用不去重的一边时不记。
- payload 带了实际生效的「未采用原流程时」(同样是 f7d1a2e 加的)就照它说,不再去取图快照。子工作流里的节点在图快照里找不到,有了它也能说准;值认不出时仍回到图快照。

夹具与检查
- 夹具新增两个变体:只有一边按时间筛、只多一个渠道条件,差异说明都是 explain_sql_diff 的真实输出。每个指标、每个变体都附上服务端预告的真实输出(catalog_preview、variants[].catalog)。backend/tests/test_dual_check_fixture.py 有两项检查:一项不依赖服务端,查预告的形状和写目录的门槛;另一项在服务端模块合入后,逐项比对夹具和 dual_check_facts.preview。regenerate 也会一并重新生成预告。
- 预览用例 dual-check-approval 认地址参数 variant / catalog / on_reject,不带参数时 payload 只有约定里的几项。
- check-verify 按服务端的预告核对两种说法:没有预告的一节,在三种情况下都要以「仅当」开头,并照实说出不写;只差去不去重时,两种选择各断言一次。有预告的一节,核对两边写什么或不记、两边都不写时不提、选中那一句加重(去重的两种选择分别看)、认不出时回到有条件的说法、取不到完整对照时照样说,以及 390px 下深浅色的对比度。payload 的 on_reject 那一节核对:照它说、不取图快照、子工作流也说准、认不出时回到图快照。
- 去掉实现以后,检查脚本在这三种情况、预告和 on_reject 上共有 13 项变红。改动后为 274 项全部通过(原来 218 项)。check-all 里 check-verify 的耗时估计按实测改成 65 秒。
2026-10-05 16:56:05 +08:00
ThearchyHelios 52baa0d65c 双盲复算前端复核修正(第 1 轮):高亮按服务端真实的差异输出做,「记入数据目录」只在服务端真会写时有条件地说,后果和提示按节点的处置说
审批卡
- 对照两条 SQL:text_diff 是规范化之后的行(列名带表名、条件并成一行),和原文逐行对不上,原来按「两边逐行相等」高亮在真实输出上一处都标不出。改成两段原文按行做一次 LCS(不看空白、大小写和行尾逗号分号)高亮不同的行,一行都对不上时不乱标;text_diff 分原流程、盲算两栏,每行高亮(窄栏上下排)。
- 「只差一个方面、会记入数据目录」:照服务端 dual_check_facts 的门槛收紧——不等价、没用兜底、差异恰好一条(几个输入都对不上时合并后至少两条,所以也就是只有一个输入对不上),且是时间列、筛选条件或聚合;按这三种分别有条件地说会记成哪一项,选「两边都不对」不记、已有人工确认的不覆盖、以时间线为准。时间范围、两条筛选、关联、解析失败、多个输入合并都不再说。
- 后果和提交后的提示:payload 不带 on_reject,从这次运行的图快照里按节点 id 读「未采用原流程时」;判为失败时写明采用盲算或都不对会终止运行、提示也照实说,缺省时不再挂那句,读不到时有条件地说、提示不下结论。
- 只有解析失败时和摘要阶段一样按兜底说(固定那句 + 解析的原话),默认展开对照;兜底的原话另有原因(比较超时)时附在下面,一边没有 SQL 时不说「两条 SQL 的写法不同」。
- 认不出任何指标时留一个「驳回并终止」(approved 为假),运行不再一直挂着。

时间线
- dual_check_catalog 的 item 是目录项的键(business_date 等),按数据目录的叫法写成「「orders」(shop)的业务日期」,认不出的键不显示。
- dual_check_limit 的 metric 是指标 ID,不再当名字加引号。
- challenge_skipped 的 no_report 是报告文档读不出来(报告节点找不到时节点直接报错),说法和下一步改成去查报告节点有没有执行成功、在不在执行到的分支上。

检查器
- 字段名和服务端校验报错的叫法(schema.py 的 DUAL_CHECK_FIELD_LABEL)对齐,处置选项以服务端的短说法开头;check-verify 在服务端合入后逐项比对。
- 盲算模型移出高级选项:时间线「模型相同」的定位要找得到它。
- 上游有几张口径卡时写明必须选(服务端校验会挡住发起运行),不再说「建议指定」。
- 「跟随设置」的当前值每次打开检查器都重取,改了设置回到画布不再是旧值。

测试
- 夹具里的差异说明换成 explain_sql_diff 对同一对 SQL 的真实输出,新增几对 SQL 的变体;backend/tests/test_dual_check_fixture.py 核对夹具和真实输出一致,并可重新生成。
- check-verify 补真实形状下的高亮、各种差异下「记入数据目录」说不说、只有解析失败和兜底原因、按处置说后果和提示、认不出指标时的驳回、叫法比对、多张口径卡、设置重取;check-decode 改用服务端真实的日志形状。check-verify 的耗时估计按实测改成 45 秒。
2026-10-05 16:10:55 +08:00
ThearchyHelios 12dc47b976 期 3 反方审稿(前端)复核修正:要审的报告按服务端的认法定,校验报过的不再重复,补齐降档提示的反例检查和运行类别取不到时的说明,修好显示全部的焦点与去重,处理审稿记录没存上的情况
检查器
- 「要审的报告」留空时,照服务端 schema.challenge_report 的认法:先看直接连着的报告撰写节点,恰好一个就审它;不是一个时,整个上游只有一个才取那一个。以前只认第二步,「初稿 → 终稿 → 反方审稿」这种接法下会误报「上游有 2 个,请选择」,同模型提醒也不出。现在留空项写出实际会审的那份(「未选择:审上游的「终稿」」),同模型提醒也按同一套认法判断。
- 认法写成 nodePickField / upstreamModel 的 rule 选项。缺省是 'upstream'(只看整个上游),和 F1a 的 dual_check_card 一致,双盲复算以后也能直接用。
- 选中的节点在上游、类型却不对(例如输入节点),以前写成「不在上游」,现在照实写「不是报告撰写节点」,提示里说清它是哪类节点。判断顺序和服务端一致:先看存不存在,再看类型,最后看在不在上游。
- 画布校验已经在 report / model 字段上报过问题时,不再画本地那句提示,避免同一件事一琥珀一红说两遍。判断哪些问题属于本字段,用和 Inspector 挂字段时相同的 fieldOfIssue;下拉里照实标出的那一项保留。
- 文案里的设置入口统一写成「设置 → 偏好设置 → 核查」,和设置页的真实标签、双盲复算、证据裁判的写法一致。

审批卡
- 降档的原因改为常显在概况下面,不再只放在悬停提示和读屏文字里。
- 运行类别取不到时,不再悄悄不写降档:照实写「暂时无法确认运行类别;如为正式运行,被推翻的结论会使出具降档」,并给出重试按钮;窗口重新拿到焦点时也会再取一次。
- 「显示全部」补句时按 unit 去重:两边都有 unit 时只比 unit,有一边缺 unit 才比原文。以前原文相同、unit 不同的一句会被吞掉,被吞的可能正是被推翻的那句。条目缺 unit 时不再补假的 #i。
- 键盘按「显示全部」、补句那一行的重试、一句详情里的重试、运行类别的重试之后,焦点都会接到新出现的内容上,不再掉到 body。焦点已经被用户移到别处时不抢。
- 审稿记录没存上(artifact 为 null)时,每句只列判断,不能点开,整块说一句「反方审稿记录未保存,无法查看理由和查询」;「另有 N 句未列出」照常显示,只是不给「显示全部」。

检查(check-challenge 共 153 项)
- 新增预览用例:正式运行且没有被推翻的结论(降档 / 只标注)、探索运行配只标注、运行类别取不到、原文相同而 unit 不同、审稿记录没存上、链式接法的检查器。
- 「只标注、探索运行、没有反方审稿」拆成各自独立的段,一段出错不会遮住其余几段。
- 新增的检查项包括:降档原因常显、取不到运行类别时的说明和重试(含窗口重新拿到焦点后再取)、显示全部和各处重试后的焦点、按 unit 去重、审稿记录没存上、链式接法、类型不对的节点、校验报过就不重复说,以及窄屏和深浅色下新增几行说明的对比度。
- 复核时用来证明检查不够的两个变异,M1(正式运行一律写降档)和 M10(探索运行也写只标注说明),连同本次各项修正的变异,都已逐一确认会被检查发现。
2026-10-05 15:35:01 +08:00
ThearchyHelios 7a9dc93dde 双盲复算前端(三):检查器字段、节点卡片摘要,以及检查器与节点卡片的钩子
- nodeDefs:照约定一字不差地加 FieldDef.render 与 FieldRenderProps;NodeDef 加可选的 summary(ctx) 钩子
  (ctx:id、config、画布上的 nodes 与 edges,只返回字符串);dual_check 换成真字段:要复算的口径卡、复算的指标、
  口径说明、启用、审核人不采用原流程的结果时(基本),盲算模型的接入与模型、允许的相对误差(高级)
- Inspector:照约定一字不差地在 FieldInput 的 switch 前交给 field.render
- canvas/DualCheckFields.tsx(新):口径卡下拉分上游、其余两组,不在上游或不在画布上照实提醒;指标逐个勾,
  全勾回到缺省不写、最后一个不让取消;口径说明逐个指标写,被取消的指标上已写的说明列出来可删;盲算模型照「结论句
  裁判」的写法(只填模型时写明按模型名用哪个接入);相对误差的占位写出设置里的值;启用三态,跟随设置不留 null。
  每个控件只写自己的键,留空写回 undefined
- NodeCard:用只返回字符串的 studio 选择器调摘要钩子,有就用、没有照旧 summarize;摘要写「复算「卡名」 · N 个指标」,
  关闭时标出;去掉 dual_check 的占位 case
- 预览用例加检查器(小画布用真的节点卡片 + 360px 检查器),check-verify 加检查器写配置、摘要跟着变、窄屏和对比度
- 去掉 nodeDefs 里已经不成立的「下面两种还是占位」注释
2026-10-05 14:23:17 +08:00
ThearchyHelios 504bb9ad93 期 3 反方审稿(前端):检查器与节点卡片——可配置要审的报告、句数与查询上限、反方模型、被推翻时的处理、启用
- nodeDefs、Inspector 加约定里的字段渲染钩子(FieldDef.render、FieldRenderProps,FieldInput 里给了 render 就交给它画),
  代码照约定一字不差,双盲复算的工作包会加同样的代码
- 新增 canvas/verifyFields.tsx,三样通用控件写成双盲复算也能直接用的样子,文案全由调用方传入:
  - 选画布上的节点:只列本节点上游的某一类节点(下游的运行到这里还没有产出);留空写回 undefined,按缺省取上游的那一个;
    上游没有、有好几个又没选、选中的被删掉或挪到下游,都在下面照实提醒,选中项照实列出,不像「未选择」
  - 三态开关:跟随设置 / 开启 / 关闭,对应配置里没有这一项 / true / false;单选组,方向键在组内移动
  - 核查模型:接入加模型,写法同结论句裁判的模型选择(只填模型时说明按模型名会用哪个接入、和被核查的模型相同时提醒)
- challenge 节点去掉「功能开发中」,检查器字段:要审的报告、最多审几句、反方模型(接入、模型)、结论被推翻时
  (出具降档(默认)/ 只标注 / 报错并停止运行)、启用;每句最多查询次数、每句时长上限放在高级选项。上限都可以不写,
  按「设置 → 核查」取,不往配置里落默认值
- 节点卡片摘要按配置写:审哪份报告(节点 id,没选时写审上游报告)、最多审几句(没写时写句数跟随设置),关掉的写已关闭
- terms.ts 的 CHALLENGE_TEXT:判断统一叫经受住、被削弱、被推翻、无法判断;检查器、卡片摘要和审批卡的文案都在这一块
2026-10-05 14:10:17 +08:00
ThearchyHelios 4d29b67cef 双盲复算前端(一):时间线解读双盲复算和反方审稿的全部日志代码,补类型和文案
- decode.ts:约定里的 12 个日志代码(dual_check_* 7 个、challenge_* 5 个)按 code 和结构化字段说成标题、副标题和下一步,
  不从原话里认;后端发成 info 的(一致、裁决、记入数据目录、审稿完成)也上时间线,否则这两种节点在时间线上什么都不说;
  有缺口、有推翻时用提醒色,完整对照和审稿记录的工件可下钻;老日志缺字段、类型不对时不崩、不瞎填数
- check-decode:每个代码一条断言,另有换一种取值和缺字段两组
- types.ts 末尾加双盲复算的审批 payload、对照工件、节点配置和设置里核查一组的类型
- terms.ts:DUAL_CHECK_TEXT 写全检查器、节点摘要、审批卡、时间线的文案(反方审稿日志的说法暂放 challengeLog);
  VERIFY_SETTING_TEXT 顶层和服务端 VERIFY_SETTING_LABEL 的键和叫法一字不差,其余放 section
- 去掉双盲复算节点说明里的「功能开发中」和节点卡片上的占位摘要
2026-10-05 13:54:45 +08:00
ThearchyHelios 8ed74bbe97 合入期 2 变化三分法(前端):运行对比页(摘要、指标表、效应拆分、维度归因、查询与模板差异),运行详情加「与上一次对比」
# Conflicts:
#	frontend/src/types.ts
#	scripts/check-all.mjs
2026-10-05 12:50:04 +08:00
ThearchyHelios 4b972b4f43 定时任务前端复核修正(第 2 轮):错过已跳过的悬停不再替服务端认定是超出补发宽限,没有记原因时不指向不存在的原因
服务端把两种没有补发的触发都记成 kind=misfire、status=skipped_misfire:一是超出补发宽限,二是在宽限内恢复时
积压的那几次(只发起最近一次,更早的不补)。触发类型「定时」的悬停却一律写「错过后已超出补发宽限」,积压那条的
原因写的是「积压的触发不补,只发起最近一次」,同一行给出两个互相矛盾的原因,而这条明明是在宽限以内被跳过的。

- 触发类型的悬停改成不点明原因:「按计划应在此时触发,错过后没有补发,原因见本条记录」;本条没有记原因时去掉
  「原因见本条记录」。
- 结局悬停的兜底说明(本条没有记原因时用)一起改:错过已跳过不再写「超出补发宽限」,两种原因都适用;发起失败
  不再写「到点」(手动立即运行也会发起失败),也不再写「原因见本条记录」(用到兜底时本条恰好没有原因)。
- check-schedules 的触发历史夹具按服务端的原话各放一条积压不补、超出宽限的跳过,外加错过已跳过、发起失败各一条
  没有记原因的;断言整行连同各处悬停只说本条记的原因,不说另一种,不指向不存在的原因。修复前这几项红 5 项。
2026-10-05 11:05:42 +08:00
ThearchyHelios defd118ea6 定时任务前端复核修正(第 1 轮):时区检查改成真能拦住,服务端会拒的组合当场拦下,修几处时序问题
- check-schedules:浏览器本机时区改成 America/Los_Angeles,和夹具里的 Asia/Shanghai、America/New_York 都不同。列表的下次运行和上次触发、触发历史 20 行、预览 5 个时刻,都改为比对按定时任务时区写出的原文;假预览照真服务端那样按所选时区排时刻。把页面改成按本机时区显示的变异会让 6 项变红。原先恒为真的「只读」断言改为真正检查写请求。
- 测试消息的结果:服务端的 message 只是补充说明时接在结局后面,已经是整句时不再套一层,状态码只写一次(webhookTestText)。
- 正式运行 + 工作流没发布、必填输入没填、填了已发布版本里没有的字段:照服务端保存时的核对规则当场拦下(新建总查;修改只在改了工作流、运行类别或输入时查),说明写在对应那一项下面。保存被拒、服务端指明 run_class 或 misfire_grace_s 时,说明也写在那一项下面。
- 保存被 422 拒绝后,改了被指出的那一项,字段下的说明和底部的「保存失败」就收起;名称框的 aria-invalid 和 aria-describedby 也把服务端的说明算进去。
- 时序:列表和详情页在写操作成功时作废还在路上的读,晚到的刷新不再把开关盖回旧值。详情页先开触发历史再切到设置时,版本对齐到表单所基于的那一份。保存途中又改了别的字段时,只保留途中改的那几项,替换过的 Webhook 地址不再以明文留在输入框里。
- 其他:预览时间改用 parseServerTime 解析;换工作流时,自动填的名称跟着换;开关遇到 409 用前端自己的说明,服务端原话放进详情;错过且超出宽限、没有补发的触发,类型写「定时」而不是「补发」;记录页的「定时」标记让读屏念出是哪个定时任务发起的。
- 未达标:记录页的「定时」标记在整行的按钮里面,键盘到不了。键盘能到的入口要加在运行详情的页头,或者把整行改成「打开运行」按钮和链接并排的结构,这两处都不在本包的文件范围内,留给集成时处理。
2026-10-05 10:26:22 +08:00
ThearchyHelios c7a9116424 运行对比页复核修正(第 1 轮):照服务端的实际输出改查询编号、无法比较的原因、读不到的基准和未保存工作流的说法
- 查询区不再拿服务端的 (node_id, ordinal) 当键和编号:配上的一对取本次的序号、落单的基准查询取基准的序号,
  Agent 换了查询先后时两者会撞上,React 报键冲突,「第 N 条」重复或缺号。改按同一节点在列表里出现的先后编号,
  键是「节点:第几」。
- 「拆分或原因」一栏:无法比较、新增、移除的指标,服务端只把原因放在 reasons 里,这一栏原来只剩「—」,现在写
  reasons 的第一句。不能拆的「为什么没拆」也写进展开的明细,窄屏上那一格横着滚也看不全。服务端有意不做维度归因
  的几类,写明为什么不做。检查夹具改成服务端的实际形状(decomposition_note 为 null):原来那一项是靠编出来的字段
  通过的。
- 换基准下拉:当前的基准读不到时单列一项,写短 id 和「记录不存在」或「无法读取」,不再显示成另一次运行被选中、
  选它又没反应。本次的记录读不到时写明原因并给重试,不再一直停在「正在读取」。运行卡读取失败也给重试,记录不存在
  的照实写。
- 不属于已保存工作流的运行(没保存过,或工作流已删除):「与上一次对比」不可点并写明原因,对比页也不再叫人去上方
  选基准。服务端对这两种运行都不比。
- 错误说明:409 按机读码分「尚未结束并封存」和「封存核对不一致」,去掉界面上没有的「封存凭证条」。基准不存在时
  提示在上方另选。找不到默认基准时,下拉里有能选的运行才说「可在上方选择」。
- 菜单查找基准超过 300 毫秒就挂一条提示;离开运行详情时取消请求,晚到的答复不再把人拽到对比页。
- 一边的 SQL 拿不到时不做逐词比较,另一边不再整条标成「独有」。SQL 注释整段算一个词,注释里的撇号不再吞掉后面的
  语句。
- 分类、结构的悬停说明照服务端的分类口径改写;查询按「条」计数,和「第 N 条」一致。
- check-compare 按服务端的实际输出补上这些场景,并加段过滤 COMPARE_ONLY;check-all 里 compare 的耗时估计按实测
  改为 45 秒。
2026-10-05 10:16:15 +08:00
ThearchyHelios a0837cc82c 运行对比页复查修正:互换时不重取运行列表,拆分句的总变化为 0 时写「0」,展开控件只指向在场的明细
- 互换、换了本次之后,新的运行记录还在路上时沿用上一次知道的工作流:下拉不再先退回「正在读取」、再把同一工作流
  的运行列表取一遍(能比的两次运行本来就是同一个工作流);check-compare 补这一项
- 口径变了、数值却碰巧没变(两效应正好抵消)时服务端不给变化量的写法,拆分那句话的总变化写「0」,不再写成
  「两者之和等于总变化 无变化」
- 指标展开、查看 SQL 的按钮只在明细展开时才带 aria-controls,不指向页面上不存在的元素;参数前后两个值之间的箭头
  对读屏补一句「改为」
2026-10-05 09:06:18 +08:00
ThearchyHelios 72da2e178a 运行对比页对齐服务端的实际输出:变化百分比按百分数写,归因、遮罩、差异说明照服务端给的显示
对照运行对比后端的实现核过一遍字段的写法:
- delta_pct 服务端已经乘过 100(12.5 是 +12.5%),占比 share 仍是小数(0.4 是 40%),两处分开格式化;原先把
  delta_pct 也当小数,会写成「+1250.0%」
- 维度归因服务端只给前 10 项、另有几项写在 note 里,照写;归不了因(查询结果截断、度量列遮罩、快照读不出来)时
  给空的 rows 和一句说明,只写说明、不画空表;万一多给了仍只列 10 项并写明另有几项
- 约定之外服务端顺带给的几项按可选字段用上:输入的 masked(两边写「已遮罩」,不标变了)、查询的 differences
  (结构变了差在哪,列在并排的 SQL 上面)和 problem(快照读不出来、与哈希不一致)、模板配置项的 labels(按节点
  类型翻好的叫法,键名放进悬停提示;没给或对不上时照写键名)
- 找默认基准时的 404 分两种:本次这条运行不存在(机读码 run_not_found)写「运行记录不存在」,其余写「未找到
  可作为基准的运行」
- check-compare 的夹具照服务端的写法改,补上述几种情形;菜单入口另查「问到基准之后才跳」(先跳到只带本次的地址、
  再让对比页去找,原先查不出来);check-all 登记实测耗时
2026-10-05 08:58:34 +08:00
ThearchyHelios e8cc4bd88b 定时任务页:列表、新建与编辑、触发历史、Webhook 设置与测试
占位页换成真页面。/schedules 是列表,/schedules/new 新建,/schedules/:id 是详情(设置、触发历史两个标签,?tab=history 直接打开触发历史);App 里只有带 id、不带 id 两条路由,「new」在页面里认。

列表每行写名字、工作流、频率的中文说法、下次运行(相对时间加按定时任务时区的绝对时间,悬停写时区,本机时区不同时另给本机时间)、上次触发(发起了的链到那次运行、写运行现在的状态;跳过、发起失败写结局,悬停写原因),右边启用开关(role=switch,点了就带版本 PATCH,409 时说服务端的原话并重新载入)、立即运行(发起了给「查看运行」直达,跳过、被拒照实说原因)、编辑、删除(站内确认框写清后果)。空态说明定时任务是什么、怎么建;老服务端没有接口时说暂不支持,不露 Not Found。列表 30 秒原地刷新一次。

表单:工作流可搜索(combobox,名字空着时用工作流名填上,新建时按发没发布替人选运行类别);频率五种预设生成 cron,切到自定义时带上当前预设的 cron;右侧(窄屏在频率下面)预览接下来 5 次触发,停手 400ms 再问、新请求作废旧请求,非法时清掉上一次的时间、把服务端的说明写在出错那一项下面并标 aria-invalid;时区默认本机、列常用时区和偏移;运行类别写清正式运行要已发布、每次按当时的发布版本发起;输入按运行类别取字段(正式运行取已发布版本的),每个字段可点变量插在光标处,旁边写按下次触发渲染出的结果;重叠策略和补发宽限;Webhook 的格式、地址、签名密钥、订阅事件、发送测试消息(只测已保存的设置,改了没保存时不让测),保存过的地址只显示 url_hint、可替换或删除,密钥只说「已设置」、可替换或清除;通知里运行链接用的服务访问地址读写设置的 notify 组。

保存只交改了的字段并带版本,409 时表单不动、给「重新载入」(有改动先确认);保存的这段时间里人又改了,留着新改的;有未保存的修改时离开先问。详情页的开关和表单各记版本:开关前后没有别人插进来时表单跟着用新版本,页头是在别人改过之后刷新出来的,表单照旧带旧版本、保存时由服务端说清。

触发历史 20 条一页、加载更多带 before 往后接(去重,从头重取时作废还在路上的那一页),写计划时间、类型(定时 / 手动 / 补发)、结局(已发起 / 上次未结束已跳过 / 错过已跳过 / 发起失败)、原因、运行链接和每条通知的结果。
2026-10-05 08:56:41 +08:00
ThearchyHelios 4deffd62f7 定时任务前端底座:接口约定的类型、api.schedules、页面用的纯函数和文案
types.ts 末尾一段写定时任务的接口约定(Schedule、Fire、预览、变量、立即运行、触发历史、Webhook 测试),字段名和形状照前后端共用的约定,不各自发挥;运行列表的 schedule_id 用同名接口合并补在这一段,不去改上面 Run 的定义。

api/schedules.ts 挂上全部接口:列表、详情、新建、修改(只带改了的字段和读到的版本)、删除、预览(可取消,丢掉过时的请求)、变量、立即运行、触发历史分页、发送测试消息。

pages/schedules/model.ts 是不碰 React 的纯函数:
- 频率预设和 cron 互转:每天 / 每周(连着三天以上写区间)/ 每月 / 每隔几小时(只给 24 的约数,*/5 在跨天处会断)/ 自定义;填得不完整时返回空串,不拿猜出来的频率顶上;认不出的 cron 一律算自定义、原文照放
- 按定时任务自己的时区写时间(Intl 取各段再拼中文,周几、偏移照算),本机时区另给;距下次运行先取整再判档
- 表单和请求体互转:修改时和打开时的表单比,只交改了的字段(cron 写法不同但人没动不算改);Webhook 按约定地址省略即不改、空串即删除,密钥省略即不改、空串即清除,交 Webhook 时格式和事件总是一起交
- 表单的问题按字段给出,写在对应的输入框下

terms.ts 的 SCHEDULE_TEXT 写全定时任务页的文案;占位页的两条先留着,换成真页面时删掉。「钉钉」是 Webhook 的产品名,会被「钉住」那条规则误报,在 copy-allow.json 里登记一条例外并写明理由。
2026-10-05 08:56:02 +08:00
ThearchyHelios e6c77ea4ee 运行对比页(前端):两次运行的指标变化按数据、口径、模板与 SQL 拆开讲
- 运行详情「更多」加「与上一次对比」:先问 compare/base 找默认基准再跳到对比页;没封存、还在运行的不给点;
  找不到基准时留在原页,提示服务端给的原因,并可去对比页手动选择基准
- 对比页(/runs/compare?target=…&base=…):顶部两次运行(名字、时间、类别与版本、定时来源、未封存标记,可点进
  各自详情)、互换、换基准下拉(运行列表接口按工作流取,未封存的列出但不能选);摘要条八类的个数照服务端的
  summary,点一类只看这一类;指标表用服务端渲染值,能严格拆分的并列口径效应和数据效应、画两截条形,并写明两者
  之和等于总变化,不能拆的写服务端给的原因;展开看变化说明、输入对比、维度归因前 10 项(没有占比时写原因);
  查询区标结构状态,只参数变列出字面量,结构变并排两条 SQL 逐词标出各自独有的部分;模板区写版本、变化的节点和
  配置项;说明照实列出
- 加载、找基准、409(未封存或封存核对不一致)、422(不是同一工作流)、404、找不到基准、空对比都写清楚;请求按
  「本次 + 基准」取,换基准、互换时丢掉过时的答复,开发模式的 StrictMode 下同一份对比也只请求一次
- 窄屏表格在自己的框里横向滚动(指标名一栏钉住,展开的明细按可见宽度排),深浅色下分类标签、差异高亮对比度都
  在 4.5 以上
- check-compare.mjs 换成真检查:page.route 假接口覆盖入口、摘要、分类、拆分、归因、SQL 并排、换基准与互换、
  过时答复、各类错误、窄屏和深浅色
2026-10-05 08:43:32 +08:00
ThearchyHelios 26595b70f7 合入期 1 数字推演沙盘:证据面板里改口径卡的输入、排除查询结果的行,即时看指标和报告引用处的新值;推演只读、不写运行记录,醒目标注推演非出具;口径卡的容器型输入此后另存完整值
# Conflicts:
#	scripts/check-all.mjs
2026-10-05 07:53:42 +08:00
ThearchyHelios 633af950db 数字推演复核修正(第 1 轮,界面):整份结果在推演区里勾行,只让用到的行可勾,勾完结果就在手边,加载中和失败后不摆上一次的答复
- 整份结果、数组字段作输入时,输入下面给「勾选要排除的行(共 N 行)」,按页取整份快照来勾:证据链里没有它的查询步骤、
  或者查询步骤只给前后 2 行时也勾得全
- 查询步骤里的勾行表格只让这个指标用到的行可勾(row_span),别的行禁用并说明没用到,勾了也不发请求
- 勾行表格底下带推演结果(旧值 → 新值或原因)和「回到推演结果」;勾完、答复回来后各把它带进视野一次(答复回来时上面
  的内容会变高,把表格往下挤)
- 推演的请求和答复提到片段那一层,推演区和查询步骤共用一份;答复回来之前随改动变的部分变淡、标为忙,请求失败时结果、
  排除标记、报告中会变的地方、下游口径卡都不显示,不拿上一次的答复充数
- 整个指标推演不了(口径卡没记输入)时只说原因,不再同时写「无可推演」和「无变化」,也不画勾选框
- 快照读不出来的输入写「查询快照无法核对,不显示原值」;没有能改的输入、也没有能勾的行时说一句为什么
- check-whatif 补对应检查:整份结果勾行、上下文行不能勾、勾完结果整个在视野里、封存核对未通过、加载中和失败后、整个
  指标推演不了、窄屏里的勾行表格;ESTIMATE 按实测改成 28 秒
2026-10-05 05:43:17 +08:00
ThearchyHelios e7c8d2a1f3 可验证报告复核修正(第 1 轮):运行信息拿已核对的事件对照,报告徽标连同数字一起算,遮罩判定宁严勿宽,各分支在浏览器里有确定的检查
- 页面核对加 ⑥ 运行信息:运行结果看封存范围内最后一条结束类事件的类型,运行类别看运行开始事件记下的运行参数,
  出具档位认最后一条出具判定(不再信元信息指的那一条);页面显示事件里的值,元信息写得不一样算不通过、计入总览。
  工作流名、版本、起止时间、节点名称绑不进封存,单列一组写明取自运行记录,封存说明里也写明要到系统里一并对照
- 报告标题旁的徽标连同正文里的数字一起算,旁边写分项:重算全部哈希的伪造只在 ⑤ 露馅,徽标不能还写着通过。
  分块条目多时不通过和无法核对的都列在外面,有无法核对的显示「部分无法核对」和分项计数;⑤ 改叫「数字与取值」并分开数,
  读屏分别读作数字、取值,「显示格式由服务端渲染」只附在带出处的数字上;无出处数字的说法改成未使用引用标记
- 服务端不会给出的状态算不通过:被引用的工件不在清单里、非查询快照标着遮罩、工件既没内容也没说明;报告文档导出时
  已不在服务端,总览不再是绿色的通过,写「有 N 份报告未能核对」,报告处写明是服务端已没有这份文档
- 认 json.dumps 写出的裸 NaN / Infinity,没被改过的文件不再误判不通过;哈希对得上但读不懂的照实写「无法核对」,
  和哈希不一致分开说
- 宽屏打开出处面板时正文让出右边一栏,表格里右对齐的数字不再被面板盖住;补上斜体(不用后行断言,较早的 Safari 也能执行)
- 封存哈希、运行 ID、工作流名直接写进页面,不执行脚本时写「尚未核对」而不是一直「正在核对」;脚本挪进 head,
  执行后核一遍页面顶部写出的封存哈希和数据里核对用的一致
- 成果节点和运行结束事件的规范字符串,只在封存范围内每次数据源查询都对得上无遮罩的快照(或确实没交回数据)时才给:
  升级前的运行从工具快照认出查询快照,协作团队成员的查询认不出就按带遮罩算,数据源现在设了遮罩的按工具名就挡
- 封存核对不一致的 409 改成一句固定的话,不再叠冒号、让人去本来就在的记录页;失败结束的运行在页面封存说明和导出提示里
  写明之后继续运行会重新封存;记录页上左边写着「已封存」却不能导出时,原因写在屏幕上
- tests/bundle_samples.py 用虚构数据真实生成九份样本页(遮罩快照、两份报告、早期运行、失败结束、两条出具判定、
  服务端缺文件、裸 NaN、别的运行的文档),check-bundle 断网打开逐项断言,在上面篡改引用链、运行信息、拿掉被引用的口径卡,
  量宽屏面板,看不执行脚本的样子;把核对改成恒通过、徽标不看数字等七种改坏法都会变红。pytest 补遮罩判定的三种形状、
  事后设遮罩(去掉接线即变红)、页面静态内容和样本页本身
2026-10-05 05:30:50 +08:00
ThearchyHelios cf038c95f5 证据面板加数字推演:指标步骤上「推演」,改输入、勾掉查询结果里的行,看这个数和报告怎么变
- run/WhatIf.tsx:推演区。顶上醒目横幅「推演,非出具:不会写进运行记录,也不会改动报告」,运行未封存另行提示;
  旧值 → 新值和变化量(比率、百分数写「个百分点」)、推演代入式、输入(数值可改:停顿 450 毫秒或回车、失焦才提交,
  写的不是数提示并保留上次的结果,Esc 退回)、不支持推演的输入和原因、报告中会变的地方(可定位)、可能受影响的
  下游口径卡、恢复原值;加载、失败(可重试)、空态都有。新改动来了旧请求直接丢掉,答复按请求体缓存
- EvidencePanel.tsx:MetricPart 挂「推演」开关和推演区;QueryPart 只在推演时把结果窗口换成带勾选框的表(WhatIfRows),
  勾掉的行划掉、遮罩列照旧写「已遮罩」。草稿按(运行、报告、口径卡、指标)认,同一个指标的几处引用之间来回切不清空
- 接口 api.whatif.run、推演相关类型(types.ts 末尾独立一段)、WHATIF_TEXT 文案
- 预览用例 ?syn=whatif / whatif-rail 和 check-whatif.mjs(54 项,用 page.route 假接口):请求体、防抖、回车、排除行、
  恢复原值、收起、不支持的输入、遮罩列、加载 / 失败 / 未封存、390px 与 360px 右栏不横向溢出、深浅色横幅对比度
2026-10-05 04:04:30 +08:00
ThearchyHelios d85b634f75 记录页封存凭证条加「导出可验证报告」:已结束且已封存的运行可下载,不可用时说明原因
- api.bundle.download 取文件和服务端给的文件名(优先 RFC 5987 的 filename*,没有再看 filename),下载照 EvidencePane 的写法
- 按钮只在运行结束且已封存时可用;运行中、等待审批、接着跑(留着旧封存)、没有封存清单时禁用,悬停和读屏都说明原因;
  服务端回 409(封存核对不一致等)时提示原因
- 文案进 BUNDLE_TEXT;预览用例 dev/fixtures/bundle.tsx(已封存、运行中、等待审批、未封存、接着跑)给 check-bundle 用
2026-10-05 03:58:13 +08:00
ThearchyHelios 90dac0992b 复核套件骨架(前端):节点库加双盲复算、反方审稿(把关类,图标、配色、空配置,说明和卡片写明尚未生效,检查器照常打开)。路由加 /runs/compare(排在 /runs/:runId 前,标签页标题写「运行对比」)和 /schedules、/schedules/:id,都是页头加「功能开发中」的占位页;导航和命令面板在设置前加「定时任务」,快捷键 ⌥8,设置仍是 ⌥7;八个导航项在 480px 高的窗口里放不下,矮窗口的导航项从 40px 收到 36px。请求层从 api/client.ts 拆到 api/http.ts,client.ts 原样转出原有导出并加转请求函数;schedules、compare、bundle、inquiry、whatif 各一个空的命名空间文件,从 http.ts 取请求函数、挂到 api 上,不和 client.ts 互相导入。terms.ts 给各包占好文案块(RUN_COMPARE_TEXT 和配方对照的 COMPARE_TEXT 分开)。审批卡留两个插槽:payload.kind 为 dual_check 时的 DualCheckApproval,报告核对概况后面的 ChallengeSummary,都先返回 null。预览页自动收 dev/fixtures/*.tsx 导出的 cases,?syn= 先查这里再走原有用例。check-shell 跟着改导航项和快捷键的断言,check-copy 的 for_model 检查把 http.ts 和 client.ts 合起来看 2026-10-04 23:40:20 +08:00
ThearchyHelios 46330dfd96 模型不在价格目录里时运行金额写「金额无法估算」,不写 $0:真实运行里 token 记到了上百万,金额却是 $0,看着像没花钱。llm.end 发出时,用了 token、模型却不在价格目录里的标 unpriced(目录里标 0 价的本地模型不算);运行用量按 llm.end 数出 unpriced_calls,成功的运行也补上(状态里的用量分不出 0 是免费还是没价)。运行详情、画布运行面板、航迹的金额:一分都没估出来写「金额无法估算」,估出一部分写「≥ $x」,悬停说几次调用不在价格目录中。check-trace 补断言;流式用量测试和注释里的真实调用次数换成概括说法 2026-10-04 12:27:38 +08:00
ThearchyHelios fa842a7bec 交给人工审批的报告,探索运行也在节点里裁判结论句:审批人批准前就能看到判了几句、几句证据相矛盾。按需裁判要等运行封存之后才能判,封存前放开会动证据清单的完整性约束,所以这种报告改在节点里当场判,和正式运行同一条路;没有审批的探索运行照旧按需判,不在节点里花钱。审批节点审哪几份报告的认法抽成 reviewed_report_ids,审批卡和报告节点共用,两边说的「要人审」对得上。审批卡上没开裁判的探索报告改写「这份报告没有开启结论句裁判……开启后,交给审批的报告会在批准前判完」;开了裁判却没在节点里判的老运行另给一句。助手指引、出口契约注释、前端类型注释同步;审批暂停时按需裁判仍拒绝,测试改成只看点击不多一次调用 2026-10-04 12:03:14 +08:00
ThearchyHelios ee0700eca6 合入 FA:结构化抽取截断重试、写作清单按模型窗口定预算并按来源均衡、缺失断言交回重写、日期时间按可读格式显示 2026-10-04 11:43:21 +08:00
ThearchyHelios 4e1adec205 审批卡标明运行类别、附上审的报告的核对概况:真实运行里审批说明写着「批准后才会正式出具」,那却是一次探索运行;报告里一句结论和证据相矛盾,审批人批准时完全不知道。人工审批的卡上加一行运行类别和批了会怎样(探索运行写「批准后输出,这是探索运行,不是正式出具」,正式运行写从已发布版本发起);human 节点挂起时,上游直接连着的、或标题和说明里引用了正文(nodes.<id> 或报告的 assign_to)的报告撰写节点各带一份核对概况(payload.reports:同 report.checked 的 stats、结论句策略、裁判摘要、报告文档工件 id),卡上写「N 个数字都有出处」和结论句的核对状态(节点里判过的写判了几句、几句证据相矛盾;没开裁判或探索运行写「结论句尚未核对」),并给查看逐段证据的入口,点数字打开证据面板。check-stream 补断言 2026-10-04 11:29:04 +08:00
ThearchyHelios 546d0e9326 没有数据目录的大库:助手「参考了 N 张表」那一行提示先起草目录。真实运行里的大库一张目录都没有,挑表和 SQL 检查都用不上目录,用户也不知道该先去起草。服务端 context 操作的每个数据源多带 source_id 和 catalog_tables(去掉驳回项后还有内容的表数);前端 copilotContext 在要挑表的大库 catalog_tables 为 0 时给出下一步「这个数据源还没有数据目录,起草后挑表和 SQL 检查会更准」,入口直达 /data/catalog/:sourceId(几个库时点名,老服务端不给目录表数时不提示)。check-decode、check-stream、check-chat 补断言 2026-10-04 11:28:49 +08:00
ThearchyHelios 799c80b97e 清单有省略时不许断言「没有数据」:写作规则加一条,核对认出缺失断言交回重写一次,仍有的只标注
一次真实运行里写作者只看到上百次查询里的前二十来次,却写出「某类数据缺失、本轮没有查到任何结果」这样的断言,可那个 Agent 实际查到了上百条记录。

- 写作规则:清单有省略、或有来源的结构化结论为空时,不得断言没有查到、不存在、缺失、没有数据,只能写「本报告未覆盖」并说明依据不足
- 组装文档:清单有省略时按一组明确的说法认出缺失断言(没有查到、未查询到、查不到、没有任何记录、数据为空、数据缺失、不存在相关记录、暂无数据等;「不存在明显差异」「不代表没有数据」这类不算,代码块不查),记新违规 absence_claim,带 span、所在片段和原句
- 和句中的 [[see:]] 一样归入 REWRITE_ONLY:交回重写一次,重写后仍有的只标注、不判失败;只剩这几类时不再按最多重写次数反复重写。仍有时报告节点发 report_absence_claim(带 count、texts),运行复核算作缺口
- 证据面板的违规清单标「缺失断言」并写明为什么依据不足,时间线给 report_absence_claim 专门的一行,文案在 terms.ts;check-decode、check-evidence 补断言
- 没展开的查询的摘要在没有表结构快照时从查询快照里的 SQL 认表名
- 回归测试:合成的门店、会员、卡券、活动库真跑「4 个 Agent 并行查库 → 报告」(查询次数虚构、分布悬殊),覆盖抽取截断重试、两次截断记空值、清单均衡和缺失断言的重写
2026-10-04 11:28:23 +08:00
ThearchyHelios ab9d45c428 数据目录 F2b:剖析报告和目录页读结构化字段,不再从原话里认——服务端最小改动:码值候选的结论带 pending(还有几个含义待填写),关系的结论带 cardinality_checked;报告里「N 个含义待填写」读 pending,基数写「已用数据核实」或「子表一侧未核实」读 cardinality_checked,挑表时跳过的空表读 empty_tables 列出来;表详情的关联关系标出基数已核实;剖析说明不带日期后,码值弹窗的说明后面按这一项的 updated_at 写时间;补后端测试和检查脚本的断言(假答复的 summary 不再写待填写) 2026-10-04 03:06:14 +08:00
ThearchyHelios 88c63bfd41 合入集成分支 feat/data-catalog(d897981,含 F2a 的证据面板、时间线和服务端修复):自动合并,没有冲突;catalog_profile._relation_finding 两边的改动(F2b 的 previous_status、F2a 的 cardinality_checked 写在关系上)互不重叠 2026-10-04 02:52:28 +08:00
ThearchyHelios ac4ea030a8 数据目录 F2b / B3:发布前检查里 SQL 检查的问题带上和证据面板同一个级别标识(错误 / 提醒),并说清两个发布级别拦不拦:错误级在已发布级别只提醒、不拦,受管级别会拦下;结论那句话里点出其中几处是 SQL 检查的错误级问题,不再和「没指定模型」这类提示一个样;检查脚本的伪造门禁补上没有口径卡的图;补检查脚本的断言 2026-10-04 02:36:26 +08:00
ThearchyHelios 6263725c2a 降档时报告页顶部写明出具档位和原因(B5):出具声明和 issuance 事件另带结构化的 sql_checks(哪次查询、问题、受影响的引用、对应的缺口),证据页签在报告上方放出具横幅,SQL 检查导致的降档单列一块写在显眼处、不在其余缺口里重复;不是完整出具时「N 个数字都有出处」不再画成绿色 2026-10-04 02:33:15 +08:00