Commit Graph

1112 Commits

Author SHA1 Message Date
ThearchyHelios cb2fdd860f 证据接入按 W1-a、W1-c 的实际接口对齐:复算就是真的 app.analysis.recompute——load 交查询快照工件的原内容、load_result 交上一层结论(只认封存范围内交回过的查询、台账记过的结论,取不回照实说取不回哪一份),方法升没升版按结论里的 method 和现在的 contract.METHODS 比(升了版、复算成立的写结果同不同,现在的方法复算不了的写明原因),去掉为算子没落地准备的那一套;关键数的代入式按真的具名的数写(乘积拆解补上,波动基线按变化率比的按百分比写,负数加括号)。口径卡指标上的可比性结论(不进台账、只从卡上引用)点得开:证据面板的指标步骤带它整条出处链(判定 → 方法 → 计算 → 输入 → 复算 → 封存,封存按卡上记的 sha256 认),报告导出收在一个可展开的块里,可验证报告随附带的卡一起附上、④ 按已核对的卡认它、数字详情里展示各项检查和服务端复算;裁判的指标摘录、写作目录照卡上记的判定语写。现查结果分清按运行当天现算的界、一列一个值都没有、表的范围;可验证报告里分析工具的 tool.end、分析卡的 analysis.end 和结论同一个认法才带内容,输入的角色写叫法。测试改用真算的结论(run 交的输入照分析入口的写法,复算交工件原内容),下钻、总数闭合、方法升版、可比性端到端都过真的复算 2026-10-21 13:49:09 +08:00
ThearchyHelios d2b5096e97 合入集成分支 an/w1(W1-a 分析算子库):证据接入按真的 run / recompute 对齐 2026-10-21 13:14:48 +08:00
ThearchyHelios f816fc4c25 合入 W1-a 分析算子库:五个算子(变化拆解三种模式与下钻、波动基线、趋势、差异检验、可比性检查)、纯 Python 统计、规范十进制、判定语与标签消毒、目录事实、期次、现查与复算;Wilson 移到 analysis/stats 共用 2026-10-21 13:11:45 +08:00
ThearchyHelios ab98c7430c 分析算子收尾:复算剔除系统字段改用同一个 DERIVED_PARAMS;去掉没用的导入和小函数;测试按仓库的写法从 tests.analysis_samples 导入样例 2026-10-21 13:08:14 +08:00
ThearchyHelios d8375c2251 可验证报告认分析结论:报告引用的(含分析范围里点名的)分析结论按原字节嵌入,连同它的输入快照和下钻的上一层结论;任一份输入快照证明不了没碰遮罩列的,结论也只给 id;分析卡的节点完成事件在它的结论都随文件附带时才带内容。导出时服务端按封存的输入复算一遍,结果记在结论的条目上。核对页:③ 遮罩白名单加分析结论,④ 按「已核对的分析结论的输入」认输入快照,⑤ 判定语、具名的数、结果表的格逐字核对是不是结论里写的那几个字(同服务端的渲染规则,不在浏览器里重算统计),数字详情里有分析结论一节(判定语、判定标准、方法与版本、附带说明、Agent 写的假设、输入的核对状态、导出时服务端的复算结论),正文后面渲染分析范围、编号点得开。另在 node 里用最小的 DOM 替身把导出页、核对页点开分析结论的路径各跑一遍 2026-10-21 13:07:55 +08:00
ThearchyHelios 7474fa5030 证据接口认分析结论:封存范围按台账记下分析结论;证据图的 A 条目带算子、判定、谁做的,连「派生自」的边到它的输入(Q…)和下钻的上一层(A…);片段接口的出处链为判定 → 方法 → 计算 → 输入(每份输入落到哪个 Q、用了哪些列和行、headline 闭合、下钻的上一层,接输入快照的查询步骤并照常遮罩)→ 复算(按 sha256 取回封存的输入、在线程里复算并逐字段比,算子没落地、出意外照实写复算失败,不让接口出错)→ 封存,结论哈希不符的只给判定和封存两步并写明原因;Agent 写的假设标成 Agent 写的假设;片段说明分判定语、具名的数、结果表的格三种。指标步骤展示口径卡记的两期可比性(点得开那份可比性结论)。审计:分析判定、分析结论的叫法,结果表的格按台账认封存,分析说法核对的三种违规单列一行,违规码补上判断词未挂分析结论、判断与分析结论不符、因果说法没有依据,以及原来就缺的依据写在句子中间、缺失断言。报告导出:判定语片段按引用键共用出处链,分析范围里的编号接同一条链。裁判的 loader 把分析结论的输入快照也逐份遮好 2026-10-21 13:07:55 +08:00
ThearchyHelios 4dd6889e69 报告导出认分析结论:点开判定语、具名的数、结果表的格,面板依次是判定(判定语、判定标准、点名的段与方向、这一处引用的是哪一项、谁做的、附带说明、Agent 写的假设)、方法(方法与版本、参数、实际用的阈值、现查的表范围)、计算(关键数的代入式、具名的数、结果表,引用的格高亮)、输入(角色、落到哪个 Q、用到的列和行、总数那一格的闭合核对、下钻自哪个 A,后面接输入快照的查询步骤)、复算、封存;指标那一步另展示两期可比性。报告文档带系统写的「分析范围」时,正文后面服务端渲染这一段(现象、拆过按下钻缩进、排除、算不了、没拆、检验次数),编号点得开同一条出处链;没有这个字段的文档一个字都不多。顺手修掉查询步骤「共 N 行」那一行把函数原文当标签显示的老毛病 2026-10-21 13:07:55 +08:00
ThearchyHelios 7e95703a94 结论句裁判与口径账本认分析结论:引用了分析结论的句子,裁判摘录里给方法与版本、判定语、判定标准、关键数、附带说明、结果表(被引用的行先给)、输入取自哪几个 Q 用了哪几列和它们的 SQL、下钻自哪个 A(核查 agent 的摘录照旧分段遮);摘录里有分析结论时裁判规则另加一条(判定是系统算的,只判句子说法和判定是否一致,分析说明不了原因),没有分析结论的报告规则一字不差。口径账本不给分析结论里的数(判定语、具名标量、结果表的格)标口径、不按它们投影比对、不进整题判断的计数,也不算成没比对 2026-10-21 13:07:36 +08:00
ThearchyHelios 855a559300 分析结论进证据链(引擎):台账 kind analysis 的条目在写作目录里按台账先后编 A1、A2……(只收报告祖先里的,报告节点的「证据来自」按做它的节点过滤),条目照 catalog_result 的约定带着从工件取回、复验过哈希的整份结论,取不回、哈希不符的记明原因;存进报告文档的目录只留摘要,整份结论按工件取回。引用:[[a:A3]] 渲染判定语(一个片段,种类 analysis,整段涂白、不算裸数字),[[a:A3.键|换算]] 渲染具名标量(换算同指标),[[v:A3.r0.列]]、[[table:A3 …]] 取结果表(表头写结果表的列名,表头里的数不算裸数字),[[see:A3]]、[[see:A3.r0]] 当依据;写错的编号、键、越界的行、判定语加换算都照实说为什么。受管级别的正式出具、契约没开「单元格引用」时,Agent 现场做的分析和它查的格同一个规矩,分析卡做的照常引用。写作目录加「分析结论」一段(判定语、判定标准、具名的数、结果表前 table_top_k 段与其余几段、附带说明、算不了的原因、来自哪几个 Q、下钻自哪个 A、输入查询的 SQL 检查问题,外加引用写法一句),放不下时判定和具名的数一律列出、结果表排在查询的行前面补、最后才退;口径卡指标上的可比性(有条件可比、不可比)照实写出原因。SQL 问题顺着分析结论的输入往下找。另有复算(analysis_recheck:算子没落地、调用写错、出意外都照实写「复算失败:原因」,方法升版写明前后两版)、复算用的输入快照、关键数的代入式,证据面板、导出、可验证报告共用 2026-10-21 13:07:36 +08:00
ThearchyHelios 8137f0cf37 分析契约补两样(只加不改):算子、模式给人看的叫法(OP_LABELS、MODE_LABELS,method_label 拼成「变化拆解(可加)」),证据面板、写作目录、审计、导出、可验证报告、裁判摘录同一份;按形状认一件工件是不是分析结论(is_result:op 是五个算子之一、method 是文字、inputs 是列表),证据接入取回结论工件、SQL 问题顺着结论的输入往下找、可验证报告认嵌进来的工件都按它认 2026-10-21 13:07:36 +08:00
ThearchyHelios 7d31922d00 五个分析算子与 run / recompute(细案 01 §1–§8):decompose(additive 按维度算贡献、headline 与下钻闭合、抵消、新出现 / 消失;ratio 中点对称拆结构与自身效应、辛普森、分母小;factor LMDI-I;两份快照先做可比性,口径结构不同不拆)、baseline(中位数与 MAD 的稳健 z、σ̂ = 0、日数据 lag 7、新高新低)、trend(Theil–Sen + Mann–Kendall、末尾连续期数)、differ(rate 的 z 检验 / Fisher、mean 与 rows 的 Welch、Holm、rows 的敏感性)、comparable(同口径、窗口长度、整期、星期构成、数据问题,现查记进 probes);run 先登记现查、查完再算,运行当天和目录事实记进 params,recompute 只用记下的、不现查;判定码、原因码、附带说明码都在契约里;输入记下方言和遮罩列名,复算逐字段相同;测试用虚构零售库,每个用例都核对复算 2026-10-21 13:04:58 +08:00
ThearchyHelios 7e6d52004c 分析算子的输入、目录事实、期次与现查:inputs.py(按名字取快照、拆「名字.r行.列」、列名不分大小写、遮罩列与非数值是调用错误);facts.py(按 SQL 认结果列取自哪张表的哪一列,读目录的度量类型、叫法、业务日期,只有确认过的度量类型才拿来判调用错误;查过的记进 params,复算不读目录);periods.py(日期、YYYY-MM、YYYY-Www、YYYY-Qn、整数序号,粒度按值推断);probe.py(make_prober 走 data/coverage 的只读探查:遮罩列不探、总时限、5 分钟缓存、退回剖析事实,另在库里算按运行当天现算的界;Book 先登记、查完再算,结论只记真用到的);data/coverage.py 加几个公开的小函数(parse_sql、as_day、literal_bound、window_of、column_range、bound_values、facts_range),_fallback 的读法抽成 _facts_range、行为不变;契约补几项可选字段(InputSnapshot 的 dialect / checks / no_data / mask_columns / masked_at_query,AnalysisInput 的 dialect,Probe 的 expr / value) 2026-10-21 13:03:35 +08:00
ThearchyHelios 654cc23c85 分析结论的数与判定语:numbers.py(快照里的数换成精确的 Fraction,写成规范的十进制字符串:不带指数、去尾零、没有 -0,除不尽的和浮点留 12 位有效数字,同输入逐字节同输出);phrases.py 一处定义判定语模板(细案 01 §7.2)、数的写法(百分比一位小数带正负号、量千分位最多两位小数、百分点,ROUND_HALF_UP 同 render_cell)、label 消毒(去引用标记、出具校验认的数字写法、单位符号,≤ 20 字,空了退回目录叫法和列名)、附带说明的一句话(判定语后最多接两条)、照实际阈值写的判定标准 2026-10-21 13:03:23 +08:00
ThearchyHelios 9af50fb474 分析算子的统计函数(app/analysis/stats.py,纯 Python、不加依赖):正态分布函数(math.erfc)与分位数(Acklam 逼近 + Halley 修正)、t 分布(正则化不完全 β 的连分式,自由度很大时按正态)与分位数(二分)、Wilson(从 eval/stats 移过来,评测改为引用、行为不变)、Newcombe 区间、合并比例 z 检验、Fisher 精确检验(lgamma)、Welch t 检验与区间、Holm 校正、Mann–Kendall(n ≤ 10 且无并列用逆序数递推的精确分布,否则正态近似带并列修正和连续性校正)、Theil–Sen(精确的数在公分母上按整数比,只对浮点相等的那几个精确比)、中位数 / MAD / 名次;测试用公认表值钉住(正态 0.975 分位、t(10) 临界值、品茶表、Newcombe 例子、小样本精确分布对照暴力枚举) 2026-10-21 13:03:12 +08:00
ThearchyHelios 38906a92ea 分析能力骨架补跨包约定:写作目录里分析条目的读法(catalog_result:A{n} 条目 kind analysis、result 为整份结论)、口径卡指标上的可比性字段(MetricComparability)、报告文档里系统写的「分析范围」结构(ScopeBlock / ScopeItem) 2026-10-21 11:55:38 +08:00
ThearchyHelios 844f5571f0 分析能力骨架:app/analysis 契约(结论的工件种类、台账条目、写作目录前缀 A、引用标记 a、分析卡节点类型、五个算子与模式、方法版本、判定码、算不了的原因码、附带说明码、工具名)、设置缺省 / 取值范围 / 叫法与校验、阈值合并(缺省 ← 发起时快照 ← 分析卡覆盖)、复算比较;run / recompute 的签名(第 1 波实现);测试用的假结论 2026-10-21 11:53:43 +08:00
ThearchyHelios 9e5debfb33 合入文档重新梳理:README 中英各精简成介绍和索引(是什么、为什么用、主要功能、快速开始、部署、文档索引),细节按主题拆进 docs/zh-CN 与 docs/en(17 篇一一对应:问数据、工作流、证据与出具及复核套件、数据源、数据目录、工具、应用、评测与口径账本、定时与通知、部署、配置、PostgreSQL 与多进程、身份与安全、架构、开发、升级说明、常见问题),英文文档不含中文;代码和部署文档里指向 README 章节的地方改指新文档;新增 scripts/check-docs.py(英文文档中文字符、相对链接与锚点、中英对应) 2026-10-21 10:56:05 +08:00
ThearchyHelios 27175e2f5e 文档:「界面里的设置」表照设置页的实际页签改——偏好设置补上运行默认值、证据裁判、核查、口径账本、应用一节和界面主题;去掉不存在的「设置 → 应用」页签(应用那几项在偏好设置里,apps、identity-and-security 两篇里的说法一起改),补上「审计」页签;中英两边同步 2026-10-21 10:55:41 +08:00
ThearchyHelios 1ad087c387 文档补充:复核套件逐项写清(双盲复算、反方审稿、审批质询、数字推演沙盘、运行对比),新增「查询区间里没有数据」一节,补全访问密钥到期提醒发到哪里;中英文同步
- evidence.md「复核套件」:开头讲三项共用的只读核查 agent 和「设置 → 偏好设置 → 核查」,再按代码模块文档逐项写解决什么、怎么用、结果、局限;可验证报告的细节并进「导出」一节(只证明内部一致、封存后追加的单列、遮罩、何时能导出),复核套件里链过去
- evidence.md 新增「查询区间里没有数据」:整列是 0 时现查表里实际的日期范围,口径卡标「区间内无数据」、出具降档、写作提醒、问数据按复核重来、助手自查、宁可漏报;data-catalog.md 的数据剖析一节链过去
- schedules.md:访问密钥到期提醒写明个人密钥发本人的个人渠道、服务账号的密钥发全局渠道,以及消息里有什么;定时运行结束后的自动对比链到运行对比
- README 两版:功能列表加复核套件一条,文档索引里证据与出具一行补上新加的两节

scripts/check-docs.py:英文文档中文字符 0 处,相对链接 383 条全通,中英文档 18 对标题层级一致
2026-10-21 10:51:15 +08:00
ThearchyHelios 2714890d0d 文档重新梳理:README 精简成介绍和索引,细节按主题拆进 docs/zh-CN 与 docs/en(17 篇一一对应),英文文档不含中文
README.zh-CN.md / README.md 只留:这是什么、为什么用它、主要功能(按领域一行一条,链到文档)、快速开始、部署、文档索引、
开发与测试、许可(原文不动)。原来的每一节按读者和任务分到 17 篇主题文档:ask-data、workflows、evidence、
data-sources(新增:接入数据库、只读保证、上传表格、跨库合并、遮罩列)、data-catalog、tools(新增:工具、审批档位、
能力登记、端点、网络规则——它们管所有工作流,不只应用)、apps、evaluation-and-ledger、schedules(含通知)、deployment、
configuration、postgresql-and-scaling、identity-and-security、architecture、development、upgrade-notes(按时间倒序,
每波先写要做的事)、faq。删掉的只有模块名(api/copilot_gen.py、chat/drive.py、data/schema_view.py)、重复的话和
「以前…现在…」的叙述;操作步骤、命令、配置名、限制、权限边界都有归宿。中文是原文,英文按新的中文写;英文里界面文字
只写英文名,开头注明界面目前只有简体中文,中文占位符换成英文占位符,中文数字的例子改成不依赖中文的说法。
数据剖析可以同时剖析 2–3 张表(baf23998)收进 data-catalog。
新增 scripts/check-docs.py:英文文档(README.md、docs/en/**)不许有中日韩字符和全角符号(代码块也算),
README、docs/**、deploy/README.md 的相对链接和锚点都要通,docs/zh-CN 与 docs/en 文件一一对应、标题层级相同。
中文提示里指向 README 章节的地方改指新文档:cluster/guard.py、cluster/version.py、db/base.py 两处报错,
data/schema_view.py 文档串,.env.example 三处,scripts/prod.sh、scripts/test-postgres.sh,terms.ts 两处、
DataSourcesTab.tsx、check-manage.mjs 注释,deploy/README.md 三处链接。deploy/agentlab.env 未动。
验收:check-docs 0 问题(英文文档 18 个 0 处中文,相对链接 369 条 0 断链,18 对标题层级一致);相关后端测试
117 通过、7 跳过;tsc -b、check-copy 通过。
2026-10-21 10:23:26 +08:00
ThearchyHelios baf239981e 合入:数据剖析可以同时剖析几张表(剖析设置加「同时剖析的表数」,1–3,缺省 1 即以前的一张做完再做下一张;每张表的查询仍一条一条发,同一时刻对业务库最多这么多条查询)。按任务里的顺序一张结束就开始下一张,进度、查询记录各落在自己那张表上;止损、停用后不再开始新的表,正在做的照常做完;停止时正在做的几张各自收尾、做完的项写进目录;一张表让任务出错时另几张按停止收尾;共享的行数只估一次;409 说法改成「已完成 x / y 张表」;设置表单、风险说明、预算和估算用时按并发写明张数;中英文 README 各补一句。验收:后端全量 14979 通过(变基到最新 main 后相关剖析测试 125 条重跑通过);tsc;check-catalog-profile 217 项、check-copy 28 项全过 2026-10-21 09:08:35 +08:00
ThearchyHelios f774e42463 数据剖析可以同时剖析几张表:剖析设置加「同时剖析的表数」(table_concurrency,1–3,缺省 1,即以前的一张做完再做下一张;上限 3 是给这个源上的分析留出连接池的临时连接),每张表的查询仍一条一条发,所以同一时刻对业务库最多这么多条查询。剖析任务的执行改成按设置开几个执行者,按任务里的顺序一张结束就开始下一张;进度、发过的查询各落在自己那张表上(不再记「正在做的那一张」)。每张表开始前照旧重读数据源:停用、关掉剖析或止损后不再开始新的表,正在做的几张照常做完(止损时剩下的项记止损的原因),都结束后再把没开始的记停下;止损的连续失败、超时比例按几张表的查询合起来算。停止、关停时正在做的几张各自收尾,做完的项照常写进目录,都收完才往上交(等的时候又被停止也等完);一张表让任务整体出错(快照被改动、数据源没了、记结果写库出错)时,另几张按停止收尾、原因写这一句,本进程续不上租约的不写。同时要估同一张表的行数时只估一次(按表加锁,先来的没估成后来的自己估)。同源已有剖析时的 409 说法从「第 x / y 张表」改成「已完成 x / y 张表」。界面:设置表单多一格(单位「张」,提示写明业务库同时要应付几条查询、和分析共用连接),风险说明、卡片悬停、开始前的醒目一句在大于 1 时写明「同时剖析 N 张表、每张表的查询一条一条地发」,预算多一行,这次最多用时按几轮算。测试:同一时刻在途查询不超过设置、每张表仍一条一条发(1/2/3 三种)、几张一起显示进行中并按顺序开始、同时停止各自写进目录、止损后不再开始新表、停用时正在做的做完、一张出错另几张按停止收尾、共享行数只估一次;check-catalog-profile 加一节(预算、估算、说法、两行进行中、表清单)。验收:后端全量 14979 通过;止损那条并发测试单独跑 30 遍、整个剖析任务测试文件并行跑 15 遍都没有偶发;tsc;check-catalog-profile 217 项、check-copy 28 项全过 2026-10-21 09:08:10 +08:00
ThearchyHelios 31f3af8bac 合入:README 默认改成英文版(README.md,中文版的完整翻译),中文版独立成 README.zh-CN.md(内容不变),两边顶上互相链接;中文提示里指向 README 章节的地方改指中文版 2026-10-21 08:55:03 +08:00
ThearchyHelios 0d4ee79440 README.md 改成英文版(中文版 README.zh-CN.md 的完整翻译),作为仓库默认 README
逐节对译,不删不并:标题层级和顺序、45 个标题、18 个代码块、10 张表、142 条列表项、图片和外链与中文版一一对应;
代码块里命令、配置名、环境变量、路径、接口原样,只译注释(Mermaid 图的标签一并译成英文);行内代码原样(含 <密码>、
<数据目录> 这类中文占位符,含义不明显处在正文里附一句英文说明)。界面文字写英文译名,并在每个二级节首次出现时附中文
原文,如 Settings → Preferences(「设置 → 偏好设置」);附的中文都和中文版逐字一致。页内锚点全部换成英文标题的
GitHub 锚点,目录按英文标题重建;顶上一行「English | [简体中文](README.zh-CN.md)」。
核对:两份文件各 43 条页内链接(25 个锚点)0 条断链,deploy/README.md 指向 README.zh-CN.md 的 3 条带锚点链接也通;
中文版的 460 个行内代码在英文版里全部原样出现;正文里的数字除「200 万 → 2 million」这类单位换算外一致;
另按节对照通读复核一遍,改正漏译的限定语和几处语义偏差。
2026-10-21 08:50:47 +08:00
ThearchyHelios aadc8d0115 中文 README 移到 README.zh-CN.md(内容不改,顶上加语言切换),中文提示里指向 README 章节的地方改指中文版
git mv 保留历史;顶上一行「[English](README.md) | 简体中文」,英文版随后单独提交。
改指 README.zh-CN.md 的:报错文字(cluster/guard.py、cluster/version.py、db/base.py 两处)、.env.example 三处注释、
scripts/prod.sh 用法说明、scripts/test-postgres.sh 注释、「口径同 README「哪些角色看得到原值」」的四处代码注释
(terms.ts 两处、DataSourcesTab.tsx、check-manage.mjs),deploy/README.md 里三处「仓库 README」写成指向
../README.zh-CN.md 对应章节的链接。
没改的:deploy/deploy.sh 四处「README 的常见问题」「README「用 PostgreSQL」」和 deploy/agentlab.env 117 行——离线包里和
deploy.sh 放在一起的 README.md 就是 deploy/README.md,那几句指的正是它的常见问题、用 PostgreSQL 两节;
deploy/README.md 第 16 行文件清单说的是它自己;version.py、runner.py 文档串里「以前 README 写…」是旧事的叙述。
验收:相关后端测试 117 通过、7 跳过;tsc -b、check-copy 通过。
2026-10-21 08:13:58 +08:00
ThearchyHelios 95415dcbf5 合入:交叉表支持按文字导入的指标(「高峰时段」一行写着「18-19」时落成文字列,规则起草按文字指标起草并要人确认,配方面板加「指标类型」);堵上占位符陷阱(拒收含数字的占位符,「不是数字」的下一步按格子情况写,整行文字给「按文字导入这一行」修复按钮)。验收:配方相关测试 2195 条、新增 15 条全过;check-copy 通过;check-manage 718 项全过;真实文件本机重跑起草完整、按日 31 行、时段 527 行;泄露扫描干净 2026-10-20 11:41:44 +08:00
ThearchyHelios 9e1ff11278 交叉表支持按文字导入的指标(如「高峰时段」一行写着「18-19」),堵上占位符陷阱:配方的 measures 分段加 text_measures(标签 → text / hour_range),落成文字列(时段存规范写法),空格、公式、占位符照块的取值规则,数字、日期、解析不了的时段报 value_not_text / value_not_hour_range;规则起草遇到无标题指标块里整行是文字的行(标签不带词表单位)按文字指标起草,并出卡片和问题要人确认(「不是」就去掉,回到按数字导入、试运行拒收),确认清单加 text_measure 项,前后对照报类型和存法变化;数值区不合格的格一行合成一条起草失败(不再一行 30 条)。陷阱:以前照「请添加占位符」把「18-19」加成占位符,整格静默存成空值、干跑照样通过——静态校验拒收含数字的占位符(placeholder_digits,重放和沿用现行配方的放行),value_not_number 的下一步按格子情况写:整行文字的提示改「指标类型」并给修复按钮 declare_text_measure,含数字的不再提示加占位符;标签带单位的拒按文字导入(text_measure_unit),文字列不能写单位(unit_on_text)。配方面板每个指标多一个「指标类型」下拉(数字 / 时段 / 文字)。默认值不进规范形式,已存配方的哈希不变。测试 tests/test_recipe_text_measures.py(合成夹具,假名);check-manage 加指标类型三项 2026-10-20 11:41:28 +08:00
ThearchyHelios c2ba06014e 合入「口径数字全为 0」的一组修正(部署上一份周报:取到访的那张表只存最新一天,查上周、上上周全是 0,口径卡算出一排 0 和 0%):查询区间里表里没有数据时照实说——结果里整列是 0 或空时运行时现查(data/coverage.py:界在库里按运行当天算、表的范围现查 MIN / MAX,失败退回剖析,按列判),进查询结果和快照(no_data),口径卡按列标「区间内无数据」、写作目录照实交代、出具按缺口降档、复核记缺口并可按复核重来;助手搭图自查对工具节点写死的 SQL 同样检查、交回一轮修正,单日剖析的表加提示;双盲复算两边落在无数据的列上不判一致、无法复算带上盲算的理由;口径卡分母为 0 时提示写 None、发布检查提醒 else 0、「算不出来」和「缺少输入」分开说;指标清单按格式渲染(以前比率 0.0007 写成 0.0007%);没配出具契约的成果在实例页印章上照实写缺口。验收:后端全量 14948 通过;方言容器集成测试 PostgreSQL / MySQL / MariaDB / Oracle 全过(含部署那种文字日期 + 现算上周的写法);tsc、文案检查;相关 8 项浏览器检查 3922 项全过;泄露扫描干净 2026-10-20 11:01:35 +08:00
ThearchyHelios 680ea4ecf8 覆盖检查:现查没成功(大表全表 MIN / MAX 超时、库一时连不上)也记 LIVE_TTL_S,期间同一张表直接退回剖析、取值观察,不再每次白等 PROBE_TIMEOUT_S 秒(测试 test_a_failed_probe_is_not_retried_for_a_while);方言容器集成测试(scripts/dialect_it.py)加一段覆盖检查:只存当天的滚动表(DATE 列,MySQL / MariaDB 另有按文字 'YYYYMMDD' 存的),按运行当天现算的上周区间判成没有数据、区间包含当天只是别的条件筛空的不报,查询后和助手自查两个入口都核——PostgreSQL 16、MySQL 8.4、MariaDB 11、Oracle Free 23 全过 2026-10-20 10:58:20 +08:00
ThearchyHelios b0556e36d6 覆盖检查现查到的表的范围在进程里记 5 分钟(按数据源、上传表格的快照、表、列认):一张图里几个取数节点、助手自查几轮查同一张表,不再每次全表 MIN / MAX;查不成的、退回剖析的不记,过期了重新现查 2026-10-20 10:40:57 +08:00
ThearchyHelios b6f7cc8378 应用实例页:成果没配出具契约时(印章上是「未声明出具契约」),本该降档的缺口照实写进印章的说明——口径卡里输入取自「查询区间里这张表没有数据」的列的指标、双盲复算的缺口(无法复算、审核人没采用原流程……);配了契约的已经按缺口降档,不另写 2026-10-20 10:39:53 +08:00
ThearchyHelios f87b07694d 助手搭图时就发现「查的区间里表里没有数据」:自查(GraphChecker)对工具节点写死的 SQL 按今天跑一遍覆盖检查(data/coverage.sql_gaps:不跑原 SQL,只跑算界和现查范围的两条小查询,SQL 里所有带时间谓词的表都查,按表去重、限时,异步查库,带模板的 SQL 不查);完全不重叠的作为一条 sql_no_data 问题交回模型改一轮(换有这段数据的表,没有就在 done 的说明里照实告诉用户数据只到哪天),修正后仍在的不挡运行,作为提醒留在检查结果和交付的问题清单里(问数据流式、画布非流式都是)。look / db_schema 的剖析信息在日期范围最早和最晚是同一天时加一句「剖析时这张表的 X 只有一天的数据,可能每天整表重灌:算历史周期请换有历史的表」;助手节点手册写明按周期取数前先看表的日期范围,只有一天、最新日期早于要查的区间的表不能用来算这段时间 2026-10-20 10:38:30 +08:00
ThearchyHelios a86991b57f 双盲复算:盲算触顶、按无法复算记时(_limit_text 那一路),把盲算交回的理由(渲染后的正文,已经过遮罩)截一段带进原因(「盲算已达每项最多查询次数(1 次);盲算交回的理由:…」),审批卡、缺口说明上看得到它查到了什么,没有理由的照旧。原值所在的格子落在「查询区间里这张表没有数据」的列上时不派盲算、按无法复算记;盲算交回的格子落在这样的列上时不判一致、按无法复算记;原因都写「查询区间里这张表没有数据(…)」 2026-10-20 10:33:34 +08:00
ThearchyHelios 6fa2e297db 口径卡、报告、出具、复核认「查询区间里这张表没有数据」:口径卡按输入的快照 id + 列认(cell()、按位置取的格、Agent 经 cite_fields 交来的字段,按列,同一条查询里有数的列不受影响;转抄的指标照抄),给指标标 no_data 并写明原因,清单注明「这段时间表里没有数据:不要当成 0 解读」,发一条 metric_no_data;有出具契约的成果按缺口降档(契约收来的指标,和报告直接引用的这样的格)。写作目录里这样的指标、查询格子里这样的列都写清,写作规则加一句(目录里有这样的项才加)。证据面板的指标标「区间内无数据」并写明原因,查询步骤列出这几列。复核把 query_no_data、metric_no_data 记成缺口(DEGRADED),归进新的 REBUILD:是缺口、却值得换一张有这段数据的表重建一次,should_retry 和 chat/turn.retry_after_review 都认,问数据据此给出「按复核重来」的指示 2026-10-20 10:29:01 +08:00
ThearchyHelios 8ba95c0252 查询区间里这张表没有数据时,查询结果里照实说(新增 data/coverage.py,接在数据源查询工具上):结果里有整列是 0 或空的数值列时,把 SQL 收窄到算出这一列的那一项(去掉别的选择项、分组、HAVING、排序、取行数,只分析不执行),认出它用到的实表和时间谓词;界是字面量的直接解析,按运行当天现算的(不含列的表达式)用同一个数据源跑一条 SELECT 界1, 界2…(Oracle 加 FROM DUAL)算出来;这一列在表里的实际范围现查 SELECT MIN(列), MAX(列)(每条 10 秒),超时或失败退回剖析、取值观察记下的范围并照实标「按 X 日的剖析」,都没有就不判。日期按常见写法归一(DATE / DATETIME、'YYYY-MM-DD'、'YYYYMMDD'、8 位整数),文本列对文本界写法要一样,认不出就不判;区间和范围完全不重叠才算没有数据,一列用到几段区间时每段都不重叠才算。探查走同一道只读守卫,遮罩列不探查不报值,总耗时有上限,出错不影响查询本身。结果和快照多一项 no_data(columns、table、column、window、data_range、basis、message),运行事件记一条 query_no_data;没查出问题不加这个键,快照和以前一字不差。可验证报告认得这个键 2026-10-20 10:28:49 +08:00
ThearchyHelios 301bbd55f3 口径卡分母为 0 时算不出来就是空值,和「缺少输入」分开说;指标清单按格式渲染。助手节点手册讲口径卡的那段写明分母可能为 0 时写「… if 分母 else None」、不要写 else 0,附示例;画布校验加一条提醒 metrics.zero_for_undefined(按语法树认:条件表达式一边有除法、另一边是常量 0,两边对调、套在 round 里、嵌套的都认)。输入都齐、计算式自己交回空值的指标多记 undefined: true(状态仍是 missing_input,按状态认的地方和老运行不受影响),清单、写作目录、引用解析不了的原因、运行对比、证据面板都说「算不出来(这组输入下计算式没有值,比如分母为 0)」;推演把它当不带值的字段。指标清单({{ nodes.卡.text }})改用卡上渲染好的 rendered:比率 0.0007 显示成 0.07%、金额带千分位,和报告里 [[m:]] 一致;有值却显示不出来的照实说,不拼原值 2026-10-20 10:04:53 +08:00
ThearchyHelios 8ce578042c 合入:工作流可以改名(画布顶栏、工作流列表各一个入口;服务端拦空名、超长、重名,内置模板不改名) 2026-10-20 08:19:32 +08:00
ThearchyHelios 3c5c9d3c15 工作流可以改名:画布顶栏名字旁边、工作流列表每一行多一个「重命名」,两处共用 canvas/WorkflowPicker.renameWorkflow——只改名字,不加版本、不碰图,画布上还没保存的改动原样留着(改的正是打开的这一张时只换它的名字)。服务端 PATCH /api/workflows/{id} 的名字以前原样写入:现在去掉首尾空白,空名 422、超过 200 字 422、和别的工作流同名 409;内置模板不许改名(启动时 seed_defaults 按名字补内置模板,改了名下次启动会再导入一份原名的),界面上也不给模板改名入口,要改就「以此模板新建」。测试 tests/test_workflow_rename.py 2026-10-20 08:18:55 +08:00
ThearchyHelios 3003f737a3 合入:助手把操作写成工具调用格式(DSML、<invoke>、<tool_call>……)时照操作读;起草时一个能落地的操作都没有就当场带纠正重写一次;报错按诊断照实说;提示词写明没有工具调用接口;画布失败轮次把原因和诊断记进 meta.cause 2026-10-19 22:48:39 +08:00
ThearchyHelios 626a423625 画布助手没完成的那一轮把原因和诊断记进 meta.cause,之前的轮次也摊开「怎么办」和诊断
以前画布轮次失败只记 error 那一句,诊断(模型交回了什么)没落库:部署上那几轮事后查不到为什么失败,只能靠本地重放推断。现在 error 操作的 hint、detail、code、diagnostics 按问数据一轮同样的形状记进 meta.cause(kind=copilot),和查看记录 looks 并存;面板展开「之前的轮次」时报错带上怎么办和诊断原文,和当场看到的一样,老轮次照旧只有一句。

验证:tsc、check-copy;从这个分支另起一套服务跑 studio、stream、decode 三项浏览器检查全过。
2026-10-19 22:48:23 +08:00
ThearchyHelios 6b68961c65 助手把操作写成工具调用格式时照操作读;一个能落地的操作都没有时当场纠正一次;报错按诊断照实说
部署上画布助手连着几轮报「助手本轮未完成:模型没有给出任何修改,也没有说明原因」,又试了一次才成。本地用同一网关、同一模型、同一底图和需求重放复现:模型思考里写着「先输出 look」,正文却是一段 DeepSeek 的 DSML 工具调用(invoke name="look",参数 need、targets),意图和参数都对,只是不是约定的单行 JSON。读流只认 JSON 和原生工具调用,于是一个操作都没认出、整轮报错;画布不处理 next=retry,点重试原样再发,几率不变。提示词里「输出这一行就停下,系统把结果交回来」很像工具调用,却从没说这里没有工具调用接口。

- engine/toolcalls:take_leaked_calls 读写成文字的工具调用(DSML 竖线一到两个、带不带空格,<function_calls><invoke>,<tool_call>{name, arguments},DeepSeek 特殊 token 两种排法),按出现先后交出已写完的调用和没写完的那一段;final 时参数写完整、只差结尾的补上结尾再读,写到一半的不硬读。_MARKUP 补认 DSML 结尾标签和 function_calls / tool_calls 包装(agent 节点的识别跟着受益)。has_markup 只认标记本身
- copilot_gen._iter_ops:从有标记的那一行起攒,一次调用写完就按名字读成操作(名字是操作名的才认,规矩同原生工具调用 _call_op;op 写在最前,接着写时交回模型的是约定写法),读到 look 照样停下去查看;读不出的记「工具调用标记的名字不认识 / 参数解析不了 / 没写完」;raw 交出正文开头一段
- Generation:起草时一次调用读完、到这时还没有能落地的操作(plan、look 不算——查看完接着写什么都没认出的整轮照样是空的),把原话交回去、附 StreamDiagnosis.correction 那句纠正,当场重写一次(FORMAT_NUDGE_PROMPT,每轮一次);什么都没写的把纠正接在最后那条消息后面。诊断按次收(absorb),记 nudged。写成标记被读出、当场纠正都打 info 日志
- 报错说法:Generation.empty 默认用 StreamDiagnosis.headline(写成工具调用格式 / 只写了思考 / 什么都没有输出 / 格式不对 / 只说了打算),不再一律「也没有说明原因」;摘要注明当场纠正过
- 提示词:look 用法(四个入口共用)和画布、应用、蓝图的输出格式都写明这里没有工具调用接口
- 问数据失败原因 meta.cause(kind=copilot)带上 code、diagnostics

验证:本地真模型重放,修后 DSML 没再出现、都正常交付;把第一次调用换成读不出的 DSML 后交给真模型,都被当场纠正救回来(先 look 再出操作);原先抓到的真实 DSML 原文离线读成 look。测试:新增 tests/test_copilot_markup_ops.py(各写法、流式切碎、和 JSON 行混写、读不出的诊断、DSML look 驱动真查看、说明文字 / 只写思考 / 只写 plan / 查看后空续写的纠正、只纠正一次、画布流不报错、报错说法、提示词);空生成相关的旧测试按「一次生成先纠正一次」更新(基线夹具 no_ops 的说法)。后端全量通过。
2026-10-19 22:48:23 +08:00
ThearchyHelios bbc1f3b34c 合入:切到账号密码登录时,已经有能用密码登录的管理员就不再要求建第一个管理员(设置页按 /api/auth/settings 的 local_admins、passwordless_admins 判断;从单点登录切过来同样) 2026-10-19 18:49:11 +08:00
ThearchyHelios fa951a2756 切到账号密码登录时,已经有能用密码登录的管理员就不再要求建第一个管理员:以前设置页只要从「未开启」切到账号密码登录就一律显示「第一个管理员」表单、一律提交 bootstrap(前端 needsBoot 只看切换方向),库里已经有设了密码的管理员也得再建一个。/api/auth/settings 现在带 local_admins(没停用、能用密码登录的管理员)和 passwordless_admins(没停用、还没设密码的);设置页按它判断:有能登录的就提示「切换后用其中一个账号登录,保存后会回到登录页」、不提交 bootstrap;只有没设密码的管理员时照旧要建,并说清是谁没设密码、可以在用户列表里给他重设密码。从单点登录切到账号密码登录同样按这条判(以前不显示表单、后端却要求)。用户列表里新建用户、重设密码后,登录方式那一块重新判断。判据和后端 _local_admin_exists 同一个 2026-10-19 18:48:22 +08:00
ThearchyHelios 5d5a29cfa6 合入前端依赖 source-map-js 1.2.1 → 1.2.2(Dependabot 高危告警,只更新锁文件) 2026-10-19 18:17:00 +08:00
ThearchyHelios 3470521f46 前端依赖 source-map-js 1.2.1 → 1.2.2(Dependabot 高危告警):postcss、@tailwindcss/node 的间接依赖,两者的版本范围本来就允许 1.2.2,只更新锁文件,package.json 不变。验证:在干净的拷贝上 pnpm install --frozen-lockfile 装出 1.2.2,tsc、pnpm build 通过 2026-10-19 18:14:05 +08:00
ThearchyHelios 7bf2595b23 合入部署实例一段问数据会话里查出的 9 条修正:复核按报告最后一次核对定档(首稿没过、重写后通过的不算缺口);被随后改对的查询失败不再写进答案;「上周」这类相对日期按运行当天算,数据覆盖不到先照实说;整表引用行号超出截到最后一行;名字里的数字(和查询结果文本值一字不差的)不算裸数字;标识列(编码、编号、分组键)不加千分位(单元格显示规则 3 版,离线核对页同步);指标后紧跟同一单位不再重复;前面写过表名时字段只显示列名;建图返回空时记诊断、重来附纠正,并修掉三处工具调用被静默丢弃的路径。验收:后端全量 14871 通过;相关 8 项浏览器检查 3922 项全过;tsc、文案检查;泄露扫描干净 2026-10-19 18:10:12 +08:00
ThearchyHelios d6c22440df 名字里的数字涂白(_name_masks)先按数字串挡一道:名字一字不差出现、前后不紧挨着数字时,名字里的每一串数字在正文里都是完整的一串,正文里没有这串数字的名字不再逐个查找,快照行多时不拖慢组装和复核;放过的范围不变 2026-10-19 17:55:02 +08:00
ThearchyHelios 29c44ce65a 助手一个操作都没给(copilot_empty)时看得出模型交回了什么,自动重来带一句纠正,格式跑偏的操作不再被静默丢掉:copilot_gen 新增 StreamDiagnosis,起草阶段记结束原因、正文(不算空白)和思考的字数、认出几行操作、原生工具调用的名字、跳过的行按原因数(不是完整的 JSON、不是 JSON 对象、缺 op、工具调用名字不认识、参数解析不了)、正文里写成文字的工具调用标记,只记长度个数和原因、不记原文;copilot_empty 的 error 带 detail(一句话)和 diagnostics(机读),问数据、画布、应用润色、蓝图四处一致,非流式的 502 也带上。重来时交给助手的原因换成按诊断给的纠正(只写了思考 / 什么都没输出 → 直接输出操作、要看表先写一行 look;格式跑偏 → 每个操作单独一行完整的 JSON;用了工具调用 → 这里不走工具调用),chat/turn.empty_retry_instruction 附在问题后面,不原样重发;诊断随 turn.retry 事件记下。原来静默丢掉的写法照常读:分成多行写的 JSON(以「{」开头读不成就往后攒)、和围栏写在同一行的操作、原生工具调用里名字是操作名的(参数就是操作的字段) 2026-10-19 17:55:02 +08:00
ThearchyHelios a92f590799 字段标记紧跟在同一张表名后面时只显示字段名(部署上的「取自 某表 的 某表.某列」):[[c:表.列]] 前面紧挨着(隔空白、「的」「中的」「里的」)刚写过同一张表的名字——写成文字或 [[t:同一张表]] 都算,按 name_key 比,带库名的全名、末段都认,英文名前面还连着字母的不算——正文只显示列名,出处、证据标识照旧是那个字段,引用上记 short: true,复核照它核对显示的字;没有这一项的老文档照旧按全名核对。整篇组装、render_markers、流式渲染一致(流式渲染记着已放出正文的末尾一截)。写作规则(ENTITY_RULES)写一句 2026-10-19 17:55:02 +08:00
ThearchyHelios ba4c604539 数字标记后面重复写的单字单位也去掉(部署上的「覆盖 8条 条产线」):以前单字的单位后面紧跟着字时一律不动,现在只在它和后面的字连起来是一个更长的单位(人次、个月、台套、元/…,_LONGER_UNIT)时不动,让「人」对「人次」这样的不一致照旧露出来;「条产线」「人参加」照样去掉重复的那个字,流式渲染一致。写作规则加一条 UNIT_RULE([[m:]]、[[v:]] 自带单位,后面不要再写一遍),助手节点手册讲 [[m:]] 的那一行也写明 2026-10-19 17:55:02 +08:00