1. 06 Aug, 2026 6 commits
    • Data Governance Dev's avatar
      fix(web): 缺失注释字段 tab — 表格重做 + 类型/推测注释改 template 兜底 · 01c9b105
      Data Governance Dev authored
      两轮迭代:
      
      第一轮:参考字段长度异常 tab 的新模板布局,把缺失注释字段 tab
      从旧的 prop + fixed 改成 width:100% + min-width + 模板内联:
        - 表名 / 表注释 (template)
        - 字段名 / 字段注释 (template)
        - 类型  (prop data_type)
        - 推测注释 (prop predicted)
        - 置信度 (template + el-tag)
        - 依据  (prop reason)
        el-table 加 style='margin-top: 12px; width: 100%' max-height=560
      
      第二轮:用户反馈'推测注释和类型都没有显示',可能是 prop 在某些
      el-table-column 顺序/min-width 组合下被截断到不可见。
      把这两个列也改成 template 渲染并加兜底:
        - 类型:优先 data_type,其次 column_type,最后 '—',<code> 等宽字体
        - 推测注释:有内容则显示,无则斜体'(未推测)'
      
      未提交:.gitignore(与本任务无关的此前改动)。
      01c9b105
    • Data Governance Dev's avatar
      feat: 增量结果发布 + 每 tab 三状态徽章 + OverviewStats 必填字段兜底 · 323709a5
      Data Governance Dev authored
      之前结果只在所有 step 完成后才返回,导致前端看不到中间进度。本轮改:
      
      后端增量发布:
      - orchestrator.run_governance_workflow 新增 on_section_update 回调
        回调在每步完成且有 section_key 时触发
      - job_manager 新增 _sync_section_update 同步回调到 job.result['sections']
        (job.result 在任务结束时再被整体 result 替换)
      - api/routes.py /jobs/{id}/result 取消'必须 completed'限制,
        running/failed/cancelled 状态也允许读取 sections
      
      前端轮询 + tab 状态:
      - pollStatus 每 1.5s 同时拉 status 与 result;
        loadResult 改为 merge sections(不整体替换 jobResult)
      - TAB_STEP_MAP 映射 tab -> (step, sectionKey)
      - tabStatus computed 按状态返回 'idle'|'running'|'done'
      - TAB_BADGE 配置:info(非分析对象)/warning(分析中)/success(分析完成)
      - 6 个 el-tab-pane 全部改用 #label slot,加 el-tag 徽章
      
      bug 修复:OverviewStats 必填字段在运行中没数据导致 500:
      - core/models.py: database/host/db_type 改为带默认值 ''
      - api/routes.py: OverviewStats 构造用 try/except 兜底,失败降级到全零值
      
      AST 全部通过;本地 == HTTP 服务返回一致。
      323709a5
    • Data Governance Dev's avatar
      feat(web+step7): 国标违规 — 取数口径 + 字段点击联动 + 0违规过滤 + 表/字段注释 · 9ac8c11b
      Data Governance Dev authored
      经历多轮迭代,本次提交整合以下改动:
      
      后端 step7_standards.py:
      - SAMPLE_SPECS 列表:每条标准可对应多条抽样规格(当前 1 条 default)
      - 抽样时捕获实际渲染的 SQL 与 spec_id 落到每条 detail
        (sample_sql / sample_spec_id)— 后端保留供报告用
      - violations_flat 增 table_comment / column_comment 字段
      - 每条标准新增 violating_fields_count + details_with_violations
        (过滤掉 violations==0 的字段,前端直接消费)
      - 过滤零违规标准,不进入 violations_by_standard
      
      前端 index.html:
      - 字段点击联动:selectedField + selectFieldFilter / clearFieldFilter
        + filteredViolations computed;选中后明细表只显示该字段违规
      - 按标准统计表中字段清单改用 details_with_violations,
        自动隐藏 0 违规字段;字段数列加「N / M」红字显示有违规字段数
      - 标准列去除「取数口径」折叠面板(用户认为没意义)
      - 明细表去除选中字段时的 SQL 蓝边面板(用户认为没意义)
      - 明细表改为 4 列:表/表注释、字段/字段注释、标准/标准名、值/违规原因
      - alert 文案改为「X 个标准有违规(共 Y 条违规记录)」
      - .field-link / .field-link--active CSS:选中字段高亮
      
      数据 / UI 一致性验证:本后端 AST 通过;本地 == HTTP 服务返回(59051 字节)。
      "
      9ac8c11b
    • Data Governance Dev's avatar
      fix(web): 国标违规 tab 表格重做,去展开列参照字段长度 tab 布局 · d2917cf8
      Data Governance Dev authored
      用户反馈国标违规 tab 列被压扁、表格未铺满。上一版用 overflow-x:auto 包裹
      未能根治。根因:原 el-table-column type="expand" 嵌套子 el-table 加
      el-tabs__content 的 overflow:hidden 组合在某些视口下渲染异常。
      
      参照字段长度异常 tab 的简洁模板布局重做两个表:
      
      按标准统计(7 列,无展开):
        - 标准         width=120
        - 标准名称    min-width=380  模板:粗体代码 + 小字名称
        - 字段数      width=100 align=right
        - 抽样数      width=120 align=right
        - 违规数      width=120 align=right
        - 违规率      width=140 三色(>50% 红 / >20% 橙 / 余绿)
        - 字段清单/违规率  min-width=340  模板内联最多 6 个字段,超出显示「…等共 N 个字段」
          (替代原本的展开行,违规率按字段级别上色)
      
      违规明细(3 列大幅合并):
        - 表 / 字段         min-width=280  模板:粗体表名 + 小字字段名
        - 标准 / 标准名     min-width=320  模板:粗体规则代码 + 小字标准名
        - 值 / 违规原因    min-width=420  模板:<code> 包值 + 小字错误原因
      
      样式统一字段长度 tab:
        el-table style="margin-top: 12px; width: 100%" max-height="480"
      删除上一版的 overflow-x: auto 包裹(不再需要)。
      
      验证:本地 == HTTP 服务返回(54914 字节一致)。
      d2917cf8
    • Data Governance Dev's avatar
      feat(step6): 字段名 + 字段注释 双路径匹配,结果带判断依据 · 9112c312
      Data Governance Dev authored
      原规则只按 column_name 正则匹配,对命名不规范但注释清楚的字段(如
      code_a / value1 等通用名)漏判。本次扩展:
      
      - 规则结构改 dataclass LengthRule:
          name_pattern: re.Pattern
          comment_keywords: tuple[str, ...]
          expected_length / standard / description
      - 每条规则同时给出字段名正则 + 字段注释关键字列表(CI 子串匹配)
      - 新增 _match_rule(col_name, col_comment, rule) → (hit, basis_text)
          字段名正则未命中再试注释关键字
      - issue dict 新增字段 basis:
          "column_name 匹配 ^pattern$"  或  "column_comment 命中关键字「kw」"
      - summary 新增 matched_by_name / matched_by_comment 计数
      
      注释关键字示例(已覆盖常见中文命名习惯):
        身份证号 → 身份证 / 公民身份
        手机号   → 手机号 / 手机号码 / 移动电话
        信用代码 → 统一社会信用代码 / 社会信用代码 / 信用代码
        行政区划 → 行政区划 / 行政区划代码 / 地区编码
        邮政编码 → 邮政编码 / 邮编
        邮箱     → 邮箱 / 电子邮件 / e-mail
        银行卡   → 银行卡号 / 银行卡
      
      前端 '字段长度异常' tab:'国家标准 / 规则' 列加宽 320→340,下方新增一行
      '依据:<basis>' 小字斜体,便于审计。
      
      烟雾测试 5 用例:t1.id_card(身份证号)、t4.region_code(空注释) 走字段名;
      t2.code_a(注释含手机号)、t5.admin_code(注释含行政区划代码) 走注释关键字;
      t3.remark(备注) 正确剔除。
      9112c312
    • Data Governance Dev's avatar
      fix(web): 分析完成后按钮区显示'重新分析'而非消失 · 22ae5842
      Data Governance Dev authored
      原 v-if="currentJob" 的'取消任务'按钮:
        - 任务运行中 → 显示
        - 任务完成/失败/取消后 → currentJob 仍 truthy,但用户已无'取消'语义可做,
          按钮消失后再无任何动作按钮,体验断层
      
      改成按状态显示两种按钮:
        - 运行中:'取消任务' (danger, 调用 cancelJob 走 DELETE /api/jobs/{id})
        - 其它状态(已完成/失败/已取消/有旧结果):'重新分析' (warning)
          调用新增的 resetAndStart():
            - clearInterval(pollTimer) + close SSE
            - 重置 currentJob / jobResult / jobStatus / logs 全清零
            - await startJob() 重新启动一次
      
      测试:本地文件 = 服务返回(52958 字节一致),Refresh 图标已确认存在于 icons-vue 包。
      22ae5842
  2. 05 Aug, 2026 16 commits
    • Data Governance Dev's avatar
      fix(web): 字段长度异常 tab 二轮修复 — 合并展示列 + 表格撑满 · 3f7cfa5d
      Data Governance Dev authored
      上一轮改完后,用户截图反馈:
        - 表名/字段名/国家标准/规则 4 列内容不显示(show-overflow-tooltip + 窄列下被截断到看不见)
        - 表注释、字段注释两个数据字段没列展示
        - 表格没铺满 tab 区域,右边大量空白
      
      修复(6 列合并布局,总宽 1240px):
        - 表名 / 表注释       width=260   模板展示:粗体表名 + 小字表注释(无则斜体)
        - 字段名 / 字段注释   width=240   模板展示:粗体字段名 + 小字字段注释
        - 长度 (实际/标准)    width=130   模板:实际值红色加粗 / 灰色 / 标准值
        - 浪费字节           width=90    模板渲染
        - 国家标准 / 规则    width=320   模板:粗体标准号 + 小字规则说明
        - 建议               width=200   直接 prop
      - el-table 加 style="width: 100%",强制撑满 tab 容器宽度
      - 去掉全部 show-overflow-tooltip,避免窄列截断到不可见
      - max-height=560,行多时纵向滚动
      
      数据字段 table_comment/column_comment 在 step6 产出里就有,无需改后端。
      3f7cfa5d
    • Data Governance Dev's avatar
      fix(web): 字段长度异常 tab 表格列重整,避免视口窄时列堆叠异常 · 984dadff
      Data Governance Dev authored
      原表 9 列、累计固定宽 1100+px、首两列 fixed → 在较窄窗口下渲染异常。
      改为 7 列、min-width 弹性布局、去掉 fixed、合并'实际长度/标准长度':
        - 表名          min-width=140  show-overflow-tooltip
        - 字段名        min-width=130  show-overflow-tooltip
        - 长度(实际/标准) min-width=130 模板渲染 (实际红色加粗/灰色/标准)
        - 浪费字节       width=90   align=right
        - 国家标准      min-width=120  show-overflow-tooltip
        - 规则          min-width=160  show-overflow-tooltip
        - 建议          min-width=160  show-overflow-tooltip
        - el-table 加 max-height=560,行多时纵向滚动
      
      数据字段全部已在 step6 产出,无需改后端。
      验证:HTTP 抓取的页面 HTML 已含新表格定义。
      984dadff
    • Data Governance Dev's avatar
      refactor(step6): 字段长度检查改为纯规则匹配,移除 LLM 依赖 · a53fa3b1
      Data Governance Dev authored
      - step6_length_check.py: 移除 llm 入参与自定义字段 LLM 推断分支,
        只保留内置 GB/YD 14 条规则;签名简化为 run_step6(dict_data, log)
      - orchestrator.py: STEP_REGISTRY 中 Step 6 的 llm_mode 由 optional 改为 none;
        _run_step6 不再向 run_step6 传 llm;顶部 llm_mode 取值注释同步
      - routes.py: /api/steps 返回的 Step 6 描述去掉「LLM 可选」字样
      - README.md: LLM 依赖矩阵删除 Step 6 行,新增说明 Step 1/3/4/6/7/8 均无 LLM 依赖
      - DESIGN.md: Step 6 章节由「固定 + LLM 混合」改为「100% 固定代码」,
        删除 suggest_length_rule 示例
      - CLAUDE.md: 补充「不要自动提交,我说提交再提交」纪律
      
      验证:
        - ast.parse 通过 (orchestrator.py / routes.py / step6_length_check.py)
        - 烟雾测试:varchar(50) id_card + varchar(20) mobile → 2 条异常,符合预期
      a53fa3b1
    • Data Governance Dev's avatar
      fix(orchestrator): 依赖不在计划中时 WARN 跳过,而不是 RuntimeError · 3e07d7ac
      Data Governance Dev authored
      上一个提交引入了 wave 调度,如果用户勾选了有依赖的
      Step 但没勾该依赖(如选 1/3/4/5 但不选 2),
      调度器会在 ready=[] 时抛 RuntimeError('调度死锁'),
      整个 job 标失败,日志提示看起来很严重但其实只是用户配置问题。
      
      修复:
      - 在进入 wave 调度前加预处理,把'依赖不在计划里'
        的 Step 拎出来 WARN 跳过(沿用非关键失败的处理路径)
      - 把 wave 循环里 ready=[] 时的 RuntimeError 降级为 ERROR +
        break(防御性保留,理论上预处理后不应该再发生)
      - 调度计划日志里多加一行 '因依赖缺失跳过=...' 字段,
        用户 / 排查时可以一眼看出被跳了哪个
      
      验证(steps=[1,3,4,5] 此次失败案例):
        调整前:Job 失败,错误 '调度死锁: 剩余 [3] 但无依赖被满足'
        调整后:Step 3 因缺 [2] 被 WARN 跳过,Job 正常跑完 1/4/5
      3e07d7ac
    • Data Governance Dev's avatar
      feat(orchestrator): Step 1 必选,多步骤并行执行,Step 8 延后 · 506152ce
      Data Governance Dev authored
      目标
      - Step 1(数据字典)为强制步骤,前后端都防御性兜底
      - 其余 Step 按依赖图分波并行执行(Wave 调度)
      - Step 8 报告生成显式排在所有主步骤之后
      
      调度器(orchestrator.py)
      - STEP_REGISTRY 6 元组化,新增 required 字段
      - 新增 STEP_DEPENDENCIES 依赖图:
          Wave 1: Step 1(+Step 4 可并行,因为无前置依赖)
          Wave 2: Step 2 / 4 / 5 / 6 / 7 并发(只需 Step 1)
          Wave 3: Step 3(需 Step 1 + Step 2)
          Wave 4: Step 8 报告,在主调度结束后单独跑
      - while + asyncio.gather 实现 wave 调度
      - 必选步骤缺失时自动追加并打 WARN 日志
      - 关键 Step 失败:整流程终止;非关键:标记 failed,
        其余步骤继续(基于依赖的 wave 仍正常推进)
      - _run_step4 改为接收 step_outputs["1_data_dict"],
        避免在 Wave 1 与 Step 1 重复连库拉元数据
      
      step4_empty_fields.py
      - run_step4 新增 dict_data 参数;复用 Step 1 数据,
        缺省时回退到自取(支持独立跑 Step 4)
      
      前后端契约
      - models.StepInfo 加 required: bool
      - routes.py /api/steps 给 Step 1 标 required=True
      - index.html:el-checkbox :disabled="s.required"
        + 必选 step 标题旁红色 "必选" 标签
      - startJob 启动前再兜底检查一次 form.steps 是否包含所有必选
      
      perf
      - 全部 8 步情形下,从串行 ~55s 降至 ~30s 级别
        (Wave 2 同时跑 5 个, 加上 LLM 同时批分类 vs 串行等待)
      506152ce
    • Data Governance Dev's avatar
      fix(web): 修复概览/表注释展示为空问题,重整空字段与冗余字段 tab · 735a46e9
      Data Governance Dev authored
      后端
      - models.py: OverviewStats 补充 mid_empty_fields / standards_applied 字段,
        避免被 routes.py 的字段过滤机制误删
      - orchestrator.py: _build_overview 修正 nested overview_meta 取值(三层嵌套,
        之前一直兜底到 0 → 表/字段总数显示 0)
      - step4_empty_fields.py: 修复 table_comment 始终为空(之前从列级 row 取
        table_comment,应从 table_summary 取),新增 per_table.total_fields 与
        field_record 用同一份 table_comment_map
      
      前端 (index.html / style.css)
      - 隐藏历史记录入口(保留后端接口,便于以后恢复)
      - 移除「中空字段」KPI 卡片(位于中间不符合浏览习惯)
      - 大范围空字段 tab:
        * 字段明细(平铺:等级/表名/表注释/字段名/字段注释/类型/空值数/空值率)
          上移到主视图位置
        * 按表统计下移为辅助视图,表名+表注释合并到一列避免错位
      - 冗余字段 tab:把 prop 改成与后端实际数据一致的
        field/table_count/classification/reasoning/recommendation/source,并
        给 llm_failed / true_redundancy / suspicious / common_business /
        common_base 各加色 tag 显著标识
      - 修复"\"LLM 失败\""导致的 template compile 错误引发的白屏
        (HTML 属性里 \ 不会被当 JS 转义,把 " 换成「 」即可)
      - .app-main 宽度 1400 → 1800px,table 更舒展
      735a46e9
    • Data Governance Dev's avatar
    • Data Governance Dev's avatar
    • Data Governance Dev's avatar
    • Data Governance Dev's avatar
    • Data Governance Dev's avatar
      docs: 补充总体要求——提交需写清修改内容 · 8a88a956
      Data Governance Dev authored
      Why:与本次\"分批次提交并写明关联性\"的工作一致,固化到 CLAUDE.md,
           后续每次 commit 都遵循\"提交信息描述清楚做了什么、为什么\"的格式。
      8a88a956
    • Data Governance Dev's avatar
      feat(web): Phase 3 - Web 端治理平台(FastAPI + Vue 3) · 7b4bd4a8
      Data Governance Dev authored
      把工作流包装成浏览器化的产品:填表 → 测试连接 → 一键治理 → 实时进度。
      
      核心架构
      - web/app.py         FastAPI 入口 + CORS + 静态资源挂载
      - web/start.py       启动前依赖检查(可选 anthropic / dmPython)
      - web/start.bat      Windows 一键启动脚本
      - web/api/routes.py  12 个 REST 接口(jobs/history/standards/reports...)
      
      调度与运行
      - web/core/orchestrator.py 8 步流程调度 + 步骤级日志 + 异常 traceback
      - web/core/job_manager.py  后台任务管理 + LogBuffer + SSE 订阅
      - web/core/db_adapter.py   MySQL / 达梦 统一连接与查询
      - web/core/step_impl/      8 个 Step 的 Web 版实现
      
      LLM 增强(可降级)
      - web/core/llm.py          Anthropic / OpenAI / MiniMax 多 provider 适配
      - configs/llm.example.yaml provider / api_key / base_url / model 模板
      
      SQL 模板体系(Python 不再写 SQL)
      - web/sql/info_schema/     list_columns / list_tables  按 dialect 区分 MySQL / 达梦
      - web/sql/verify/          count_table_rows
      - web/sql/empty_fields/    count_with_nulls
      - web/sql/xzqh/            check_dict_table_exists / find_xzqh_orphans
      - web/sql/standards/       sample_field_values
      - web/sql/health/          check_connection
      - web/sql/loader.py        占位符 + dialect 自动加载
      
      前端(无构建步骤)
      - web/static/index.html    Vue 3 单页应用
      - web/static/lib/          Vue + Element Plus 静态资源
      - web/static/style.css
      
      实时日志 / 历史归档 / 报告下载
      - SSE 流(GET /api/jobs/{id}/logs/stream)
      - outputs/<db>/<ts>/findings/_all_findings.json
      - outputs/<db>/<ts>/reports/{md,docx}
      - GET /api/history /api/reports/{db}/{ts}/{file}
      
      调试能力(本次一并落地)
      - 三路日志:SSE 实时流 + web/logs/app.log + outputs/<db>/<ts>/run.log
      - 每步开始 / 完成带耗时、进度 N/M;异常带 traceback 与异常类型
      - 数据库 [DB] 连接 / SQL 执行时间;路由 [POST /api/xxx] 入参摘要
      - 启动脚本自带 web/logs/start.log
      
      Why:CLI 工作流需要登录机器;Web 端把治理入口放到任何能开浏览器的设备上,
           配合 SSE 实时反馈,业务方也能直接用。
      How:复用 workflow/ 中的 8 步逻辑与 standards/ 国标插件;新增 Pydantic 契约
           + job_manager + SSE,前后端用 REST + 事件流通信。
      7b4bd4a8
    • Data Governance Dev's avatar
      chore(gitignore): 屏蔽含真实凭据的本地配置文件 · 3747e885
      Data Governance Dev authored
      把以下两个文件加入 .gitignore,避免 API Key / 主机信息泄露:
      - web/configs/llm.yaml        含 provider api_key
      - workflow/config.yaml        含 DB host / user(密码走 env var)
      
      对应的模板文件仍纳入版本控制:
      - web/configs/llm.example.yaml
      - workflow/config.example.yaml
      
      Why:执行治理时本地会有真实凭据,复用项目时按模板复制即可。
      3747e885
    • Data Governance Dev's avatar
      feat(workflow): Phase 2 - 重构为 8 步可复用工作流 + 国标插件体系 · 160ded5f
      Data Governance Dev authored
      把 Phase 1 的 7 个独立脚本收敛成一条流水线:
      
      工作流核心 workflow/
      - run_governance.py:CLI 入口,支持 --db / --steps / --skip / --offline
      - config.example.yaml:阈值 / 数据库 / 输出配置(实际 config.yaml 不入库)
      - core/
          db.py      连接与查询辅助
          utils.py   配置加载、目录管理、JSON I/O
          reporter.py Markdown + Word 报告生成
      - steps/       8 个 Step 的实现(每个文件一个 Step)
      
      8 步流水线:
        1 数据字典 -> 2 合并/冗余(离线) -> 3 数据验证(连库)
        -> 4 空字段(连库) -> 5 缺注释(离线) -> 6 长度检查(离线)
        -> 7 国标校验(连库) -> 8 报告生成(离线)
      
      国标插件 standards/ 独立可扩展
      - base.py + registry.py 自动发现所有标准
      - std_001_id_card.py   GB 11643-1999  身份证
      - std_002_uscc.py      GB 32100-2015  统一社会信用代码
      - std_003_mobile.py    YD/T 1313      手机号
      - std_004_xzqh.py      GB/T 2260      行政区划代码
      
      Why:脚本是一次性产物,工作流才是可复用的工程;分离国标后新增规范
           只需要再写一个 std_xxx.py 文件。
      How:每个 Step 是独立类,产出统一为 dict,run_governance.py 按编号串行
           执行;国标通过字段名匹配自动加载,registry 提供全局发现。
      160ded5f
    • Data Governance Dev's avatar
      feat(data-dict): Phase 1 - 单文件脚本完成 smart-build 数据字典与首轮分析 · 31911f51
      Data Governance Dev authored
      第一阶段,针对 smart-build 数据库做一次性手工治理:
      - fetch_data_dictionary.py:拉取 information_schema,输出 data_dictionary.json
      - check_empty_fields.py:逐表扫 NULL/空字符串比例,输出高空字段报告
      - verify_merge_redundancy.py + .sql:连库验证合并候选的实际行数
      - validate_standard_fields.py:对身份证/手机/统一社会信用代码等抽样校验
      - check_field_length.py:识别 VARCHAR 超出固定长度的字段(基于国标)
      - check_uncommented_fields.py:扫描无注释字段,按字段名启发式推测
      - generate_report.py:把以上 JSON 汇总成 Word 报告
      
      Why:先把\"用什么工具看什么数据\"跑通,再抽象成可复用工作流。
      How:每个脚本独立运行,输出落 JSON 到 data_dictionary/,最终由
           generate_report.py 汇总成 数据治理报告_smart-build.docx。
      31911f51
    • Data Governance Dev's avatar
      chore: 初始化项目,记录数据治理目标 · 20dc9503
      Data Governance Dev authored
      定义项目的核心目标与约束:
      - 只读分析 smart-build 数据库(MySQL),不修改任何数据
      - 五个治理方向:可合并表/冗余字段、空字段、缺注释、固定长度字段、规范字段
      - 已识别的国标:身份证、统一社会信用代码、手机号、地区编码
      - 工作流分阶段沉淀:脚本 -> 工作流 -> Web 端
      
      Why:后续所有治理脚本、工作流、Web 端都以本目标为准绳。
      How:CLAUDE.md 描述目标;.gitignore 屏蔽运行产物(outputs/、JSON
           输出、__pycache__、work-logs 等),保留源代码本身。
      20dc9503