Commit Graph

1088 Commits

Author SHA1 Message Date
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
ThearchyHelios e9bb0afd4c 报告里标识列的数不分千位(产线编码 1203 不再写成「1,203」):新增 engine/cell_format.plain_columns,按序看查询当时冻结的数据目录给源列标的度量类型(identifier / status / attribute 不分,flow / stock / ratio 分)、源列名像编码编号(CODE、ID、NO 整词或结尾、驼峰的 Id/No/Code、编码、编号、代码)、是分组键(列、别名、序号都认)而不是聚合;SUM、COUNT、AVG 这类聚合是量,MIN、MAX 按那一列判;判断不了的照旧分千位。只看查询快照和它指向的表结构快照(内容寻址),组装、流式渲染、写作目录、出口复核一致。单元格显示规则 3 版:真有格子因此改了写法的文档记 cell_display: 3、引用上记 plain;离线核对页认 3 版、照 plain 渲染(解析不了 SQL),老文档按记下的版本复核照旧分千位。样本里订单号(order_no)随之不分组,check-bundle 跟着改 2026-10-19 17:55:02 +08:00
ThearchyHelios baf93ddfed 报告里照抄查询结果中文本格的名字(「冲压5线」「KX-205 线」)时,名字里的数字不再算裸数字:目录里每次查询的快照中、文本格里带数字的值(至少一个数字、至少一个不是数字的字,本身不是数也不是带单位的数),在正文里一字不差地出现、前后不紧挨着数字的那几段,查裸数字时涂白。组装和出口复核用同一条规则;只认快照里真有的值,不做模糊匹配,同一个数单独写出来照样要出处,数值格不受影响 2026-10-19 17:06:08 +08:00
ThearchyHelios 8f6a90c8c2 整表标记 rows= 的结束行越界、起始行在范围内时截到最后一行(不加注),只有起始行越界才算解析不了;行数上限按截完的行数算。单元格显示规则升到 3 版:截行只影响组装(截完照样展开成一格格的单元格引用、按格复核),复核 3 版以前的文档时没展开的整表标记照老规矩判,老文档里那句「没有第 N 行」不会被当成文档被改过。文档的 cell_display 改记渲染得出这些格子的最低一版(只有日期时间被改写的照旧记 2,离线核对页不受影响) 2026-10-19 17:00:32 +08:00
ThearchyHelios 41b350b87c 相对日期一律按运行当天算:助手节点手册的搭图规则(画布、问数据共用)加第 6 条——「今天、昨天、上周、本月、去年」按运行当天算,SQL 用方言里取当天的写法、agent 先调 current_time,不用 MAX(日期) 去推「上周」,要说数据最新到哪天就另取一列;报告写作规则加一条(period_rule),告诉写作者今天是哪天、上周是哪几天:数据没覆盖问的那段时间时先照实说、写明数据最新到哪天,最近一段的数可以给但写具体起止日期,不叫它「上周」「本月」 2026-10-19 16:53:46 +08:00
ThearchyHelios 5dfe2e7fd1 report.failed_queries 不再把「写错一条、下一条就改对了」当取数失败:同一个节点里,失败之后还有一条同一数据源的成功平台查询、读的表覆盖了失败那条的表(按 sql_semantics.facets 取表;失败那条解析不了就按同一数据源之后有成功的查询认),这次失败算已被替代,不进写作提示、不记 report_queries_failed;一次成功的都没有时照旧写「这次一次成功的查询都没有」 2026-10-19 16:47:07 +08:00
ThearchyHelios 1e87504e5c 复核把「首稿没过、重写后已通过」当缺口:report_repair、report_rewrite 这类「改过一次」的信号按同一个报告节点最后一次 report.checked 定档——最终通过的(没有违规;裁判摘要里不再有证据不支持的句子)不进复核的异常清单,复核模型被别的信号叫起来时,说明里另起一节「已经处理好的」写「报告「x」首稿有 N 处没过核对,重写后已全部通过」,不再写成「核对仍未全部通过、可能不准」;最终没过的照旧记缺口。report_repair、report_rewrite 的日志带上处数 2026-10-19 16:43:54 +08:00
ThearchyHelios 43909ea3f0 合入编排完善第 2 波(docs/design/orchestration-round §5):应用库可移植到 PostgreSQL(AGENTLAB_DATABASE_URL,缺省仍是 SQLite;方言调整只装在应用库引擎上、两种库行为一致;迁移按方言;断点用 langgraph-checkpoint-postgres;python -m app.db copy-to-postgres 连断点一起搬、孤儿行与缺省值照实处理;数据目录文件先写临时文件再改名;bubblewrap 沙箱不再继承环境变量);多进程协调(工作进程在库里登记、租约按库的时钟、卡住的进程自我隔离不再写、终态按属主写、运行事件 (run_id, seq) 唯一;跨进程停止;四类运行名额、交互留底其余可借;调度只由一个进程当班;实时流 LISTEN/NOTIFY 跨进程转发;花费账、额度、限流、锁、缓存失效进库;AGENTLAB_DATABASE_DIRECT_URL 与 PgBouncer 事务模式;版本不同的进程拒绝同连一个库;SQLite 单进程空闲不写库);部署时 PostgreSQL 一起起(deploy.sh install --postgres、migrate-to-postgres 失败原样退回 SQLite、升级前自动备份、内置库按部署编号认、dev.sh --postgres、启动时等库就绪);第 1 波与下一轮遗留收口(助手讲驳回出口、驳回去向的说法、子工作流在循环里的编号与外部写入幂等键、运行对比与反方审稿认子工作流、复核去重、问数据心跳不落库与事件日志清理、接手时重新核对身份、事件触发批量查询、多行查询行序不定、对账预选对照、口径凑不齐参数记日志);.env.example 与 deploy/agentlab.env 补全配置项。验收:后端全量 SQLite 14803 通过、PostgreSQL 14808 通过;多进程端到端 10/10(含进程被冻住再恢复的两种情形);tsc、文案检查;相关的 19 项浏览器检查 6830 项全过;泄露扫描干净 2026-10-19 16:34:08 +08:00
ThearchyHelios 68da5795b8 合入 nr8/d 的复核修复 R-d1–R-d6(内置库按部署编号与记下的名字认、起不来的库容器回退后不再重启、卸载只删自己建的网络、升级备份含记录表、dev.sh 读 .env 的写法与数据目录、sudo 下的 ~ 按 SUDO_USER 展开) 2026-10-19 16:19:44 +08:00
ThearchyHelios 71b83195ac 复核 R-d6(sudo ./deploy.sh 时 DATA_DIR=~/… 展开成 /root 下):有 SUDO_USER 时 ~ 按它的家目录展开(getent passwd 取,取不到退回 $HOME),「不能是家目录本身」也按它查;install、upgrade、migrate 开头打印展开后的绝对路径(DATA_DIR 用了 ~ 时注明 ~ 是哪个目录)。deploy/README 写一句(agentlab.env 已有的行没动)。假 docker 单测:SUDO_USER 的家目录、取不到时退回 $HOME 2026-10-19 16:15:21 +08:00
ThearchyHelios 49118eeef2 复核 R-d5(dev.sh 读 .env 不全):认 KEY = value(等号两边有空格,和后端的 dotenv 一致);放开发库密码的数据目录也照「环境变量 > backend/.env > .env」读 AGENTLAB_DATA_DIR,相对路径按后端的工作目录 backend/ 算,.postgres-dev 落在后端实际用的数据目录下。单测:等号带空格、export、行尾注释、backend/.env 优先、相对的数据目录 2026-10-19 16:13:35 +08:00
ThearchyHelios 65d35f6c97 复核 R-d4(升级前的 SQLite 备份只拷了应用库和断点库):填报的记录表 records/**/*.db 也用 SQLite 的备份接口拷进同一份备份,相对路径照旧,目录 0700、文件 0600;库在 PostgreSQL 时不做这份(记录表跟着整目录备份)。deploy/README 写清这份备份含什么、不含什么(上传原件和版本库、工件库、附件、知识库、沙箱工作区、.secret_key 要整目录备份),恢复步骤加上记录表 2026-10-19 16:12:07 +08:00
ThearchyHelios 676c546cbb 复核 R-d3(卸载时不看网络是不是自己建的就删):建网络时打上 agentlab.role=network 和这个部署的 agentlab.deployment 标签;卸载时标签和部署编号对得上才删,早先建的没有标签的按数据目录里记着的网络名认,都不是就只打印一句、不删。假 docker 单测:别人的同名网络、没标签又没记着的不删,自己的(含早先没标签的)删掉 2026-10-19 16:10:25 +08:00
ThearchyHelios 8b5b7f86b2 复核 R-d2(起不来的库容器回退后还在一遍遍重启):stop_pg 对在跑的和在重启的(restarting)都停;migrate-to-postgres 回退时先 docker update --restart=no 再停,再起库时(start_pg)恢复 --restart unless-stopped;./deploy.sh stop 用同一个函数一起好。假 docker 单测:镜像起不来、容器一直 restarting 时回退后停在 exited、重启策略是 no,换回能起的镜像重跑照常,stop 也停得下在重启的 2026-10-19 16:09:19 +08:00
ThearchyHelios 35bb634460 复核 R-d1(认库是不是自己的不够严):状态文件第一次记 migrating / builtin 时一并记下库的容器、数据卷、网络的名字和一个部署编号(app.ops state --container/--volume/--network,--get 取一项),库容器、数据卷带 agentlab.deployment=<编号> 标签(数据卷先 docker volume create 再起容器)。agentlab.env 的名字和记着的对不上就拒绝(install、upgrade、migrate、起停、状态、卸载都先核对),早先只记了模式的状态文件按当时的名字补记、照实打一行;库容器要标签和部署编号对得上(没编号的老容器看挂的密码文件是不是这个数据目录的)、挂的数据卷就是 POSTGRES_VOLUME,清空库之前数据卷还要带这个部署的编号(没编号的不清空);卸载碰上别人的库容器只提示不删。假 docker 单测:同一台机器上两个部署,改名指向对方、老状态文件补记之后,对方的库不被清空、不被删、不被重建 2026-10-19 16:07:03 +08:00
ThearchyHelios badcc2f6aa README:编排完善第 2 波的升级说明(缺省仍是 SQLite 单进程、新列与运行事件唯一索引、数据目录标记;应用库可换 PostgreSQL 与导入、deploy.sh 内置库与 migrate-to-postgres、dev.sh --postgres;PostgreSQL 下多进程、升级要先停全部进程;运行按类别排队与交互留底;升级前自动备份、restart 缺省只重启服务;bubblewrap 沙箱不再继承环境变量;循环里的子工作流编号与幂等键;问数据心跳不落库与事件日志清理、接手时重新核对身份;行序不定;驳回去向的说法) 2026-10-19 15:46:49 +08:00
ThearchyHelios af919a88aa 合入编排完善第 2 波(集成):应用库可移植到 PostgreSQL(nr8/a)、第 1 波与下一轮遗留收口(nr8/l)、多进程协调(nr8/b)、部署时 PostgreSQL 一起起(nr8/d) 2026-10-19 15:45:16 +08:00
ThearchyHelios d117237bbc 配置模板补上 PostgreSQL 和多进程的几项:.env.example 的应用库一节分成应用库、连接池、PgBouncer、多进程、开发用 PostgreSQL 五组,补上 AGENTLAB_DATABASE_DIRECT_URL、AGENTLAB_DB_PGBOUNCER、AGENTLAB_DB_POOL_TIMEOUT、AGENTLAB_DB_POOL_RECYCLE、AGENTLAB_DB_STARTUP_TIMEOUT、AGENTLAB_WORKERS、AGENTLAB_WORKER_LEASE_S、AGENTLAB_WORKER_HEARTBEAT_S、AGENTLAB_SCHEDULER、AGENTLAB_SCHEDULER_TICK_S、AGENTLAB_BUILD 和 dev.sh --postgres 的 AGENTLAB_DEV_PG_*(都注释着,名字、缺省值照 core/config.py 和脚本);dev.sh 的 AGENTLAB_DEV_PG_* 也认 .env / backend/.env(环境变量优先,和后端的配置同一个规矩,不 source)。deploy/agentlab.env 末尾再追加「外接 PostgreSQL 与多进程(可选)」一段(地址写宿主机网桥 172.17.0.1、放行容器网段,和内置库二选一;断点库、PgBouncer、直连地址、工作进程、租约、连接池、启动时等库),已有的行一行没动。deploy.sh:AGENTLAB_DATABASE_DIRECT_URL 也算外接的库(和内置互斥),只设直连地址不设 AGENTLAB_DATABASE_URL、内置库开 AGENTLAB_DB_PGBOUNCER、SQLite 时 AGENTLAB_WORKERS 大于 1 都在起容器之前照实拦下(migrate-to-postgres 在停服务之前查)。单测:这些 AGENTLAB_* 经 --env-file 进容器、几条拦截、模板两段的项和缺省值、dev.sh 从 .env 读设置,以及守卫——config.py 里应用库、连接池、多进程、调度几类配置每一项都要在 .env.example 里有 2026-10-19 15:41:37 +08:00
ThearchyHelios e8743aa8c4 更新 agentlab.env 配置:将 HOST_PORT 修改为 8080,DATA_DIR 修改为 ~/agentlab_data 2026-10-19 15:30:45 +08:00
ThearchyHelios b52a67b18d 后台任务的 drain 不再空转:notify.service、eval.cleanup 的 drain 改用新增的 core/background.drain——做完了的任务直接从集合里摘掉,只等本事件循环上没做完的,别的循环上没做完的不等、循环关了的摘掉。以前 while _background: await gather(...) 碰上别的事件循环上做完、discard 回调永远不跑的任务,gather 立刻返回、不让出事件循环,在那里空转(CPU 打满、进程卡死):PostgreSQL 全量里 test_personal_apps 的收尾两次卡在这里。单测在另一个线程里跑 drain、按线程等(空转时事件循环转不动,wait_for 救不了) 2026-10-19 15:29:00 +08:00
ThearchyHelios 39bc76494e 测试:随机名字不带数字——新增 tests/fixtures/names.letters(uuid4 的十六进制里数字换成字母,同 test_run_data_versions 的写法),dual_check_shop 的数据源名、盲算的调用编号,评测、应用说明检查、导入、遮罩、通知几处测试里拼进文本的随机名字都改用它(以前带着「330」「300」「48」这类数时撞上「文本里不许出现这个数」的断言);test_eval_schedule 查通知里有没有数时先去掉 32 位编号和发送时间(随机的编号带过「310」);test_null_not_null_values_fall_back_to_the_model_default 显式导入 app.db.models(单独跑时 schedules 还没登记进元数据,KeyError)。deploy.sh 注明内置库不用 copy-to-postgres 的 --direct-url 2026-10-19 15:16:54 +08:00
ThearchyHelios 27237623c5 合入 nr8/b 的 45513c90(复核 R-b7–R-b15 和 R-b12 的尾巴:租约按库的时钟、隔离用计入休眠的钟、PostgreSQL 单进程墙钟跳变不再隔离自己、Fenced 只对绑定世代的执行抛、隔离后等不到重新登记的运行照实收尾、续租任务不退出、换身份后收拾旧身份、quota.take 交回日期、check_pgbouncer 同一主机端口(本机回环规范化)也拒绝、copy-to-postgres 抽出 checkpoint_conninfo 加 --direct-url、版本指纹算进 requirements.lock、run_events 重号记进设置);没有冲突,README、db/base.py、db/to_postgres.py 自动合并:to_postgres.main 里 nr8/b 的 --direct-url 和这边连不上时一句话报错的分支都在 2026-10-19 15:14:25 +08:00
ThearchyHelios 45513c90b7 R-b12 的尾巴:check_pgbouncer 判同一个主机端口时把主机名规范化——localhost、127.x.x.x、::1 都算本机回环,IP 按地址比(::ffff:10.0.0.5 和 10.0.0.5 相同),解析不成 IP 的按字面(小写)比、不查 DNS。补测试:localhost 对 127.0.0.1、127.0.0.1 对 ::1、IPv4 映射地址同端口都拒绝,本机另一个端口、名字不同的放行 2026-10-19 15:09:10 +08:00
ThearchyHelios c0f7aae8ad 复核 R-b15(隔离后等不到重新登记的运行原因记错、任务没摘):_drive 里 fence.ready() 等不到时照实收尾——排队中的(一步都没执行过)收成失败,写明「本进程隔离后没能重新登记,这次运行没有开始执行」并记 run.failed;要接着执行的(继续、批了审批)收成中断、断点完好可继续运行;条件更新,状态、属主变了(别的进程先接手)就不动;执行任务从 run_manager._tasks 里摘掉。补测试:隔离后新身份一直没登记上,新发起的运行收成失败、原因写对、run.failed 记下、任务摘掉 2026-10-19 15:08:39 +08:00
ThearchyHelios eb9af51abb 复核 R-b14(PostgreSQL 单进程墙钟一跳就隔离自己):取得到计入休眠的钟(SLEEP_AWARE)时 stale() 只看它,墙钟只在取不到时当后备(两只里走得多的那只);两只钟对不上(jumped)不再直接隔离,先续一次租——续租那一句按库的时钟核对「自己的租约还没过期」,以它为准:续上了只记一条日志照常,续不上才隔离。README「多进程」补一句:库服务器自己的时钟往前跳超过一个租约时所有进程一起隔离、怎么恢复,往回跳时真没了的进程要多等,本机墙钟跳了不隔离。补测试:墙钟往前往后跳一小时不算续晚了、只算对不上,计入休眠的钟走过两个租约照样算,取不到时墙钟当后备;PostgreSQL 单进程墙钟 ±1 小时续租照常续上、不隔离,真过期仍隔离;执行到一半墙钟 ±1 小时,运行照常跑完、世代不变(改前的写法往前跳那条不过) 2026-10-19 15:07:17 +08:00