背景与目标
今天一天泡在一个项目里:IPMS(个人内容产线管理系统,thinking 仓 ipms/,FastAPI + Vue,127.0.0.1:8000)。触发方式是本人开着浏览器用 element-picker 拾取页面元素,连着丢了十几条 bug/需求过来,走 dev 章程的"bug 修改模式"——CIO 直接改,禁写卡禁派岗,改完 commit + 部署 + 报结果。
目标很朴素:页面上指到哪修到哪。但实际跑出来是一条链:小功能修着修着,从 UI 按钮一路挖到发布记录回填链和数据报表的系统性断裂,最后把 9 月已发篇目从 150 追到 235。
本期工作清单(十条线)
| # | 线 | 处理 | 锚点 |
|---|---|---|---|
| 1 | 质监报告功能撤除 | 略写 | ad77f02 11:31 |
| 2 | 踩坑#10 组包弹空终端(libuv 断言) | 详写 | 36ae4b2 11:49 / 162dd63 13:58 |
| 3 | 排版 HTML 裂图第四次复发 | 详写 | e0e19a1 12:16 |
| 4 | 产线禁"上一篇/下一篇"预告 | 略写 | fca8b6f 13:22 |
| 5 | 详情页加"打开文件夹" | 略写 | 90f00c6 14:03 |
| 6 | 复制标题/复制摘要按钮 | 详写 | 53a8c0c 14:15 / b1bc7e5 14:19 |
| 7 | 撤除 CSDN 公网版图床 | 详写 | 07a2370 14:22 |
| 8 | 发布记录归档全空 | 详写 | 34c5be9 14:33 |
| 9 | 数据报表口径盲区 | 详写 | 46ba15b 14:41 |
| 10 | "9 月不是发了不少文章了?"大追击 | 详写 | 27616e8 20:28 |
过程回顾
线 1:质监报告——"没必要存在就去掉"
详情页和审核页挂着"⚠缺质监报告"的红字。本人原话:"这个质检报告意思是缺的,你看看有没有必要存在,没必要存在的话,就把这个功能给它去掉……这个质检的流程呢,其实我也不是很关心。你后台做掉就好了。"
查实:质监报告是旧 CrewAI 产线的产出物,yinliu 新产线根本不产出这个件,品控结论已由 qc_gate 硬闸承载——它不是"缺",是"永远不会有"。判定无存在必要,前后端 + 测试 + mock 同步撤除,pytest 160 绿(commit ad77f02)。
线 2:组包弹空终端——改动不查台账,踩明文雷
踩坑#10 点了组包,弹出一个没有任何文字的终端,组包失败:子进程退出码 3221226505,stderr 尾巴 Assertion failed: process_title, file src\win\util.c, line 412(libuv 断言)。
我先改了 CREATE_NO_WINDOW → STARTUPINFO SW_HIDE 想整树隐藏控制台(36ae4b2),结果团队#38 组包断言复发——dev 台账里 9-08 就记过同症,这是明文写着的雷,我改动前没查台账。当场回滚 SW_HIDE 改回 CREATE_NO_WINDOW,用 pythonw 真跑 kimi -p 实签 exit 0,pytest 160 绿(162dd63)。同 commit 里还修了组包齐套校验对 Obsidian "Pasted image"含空格文件名的误判。
规则沉淀:改进程 spawning 相关代码前,先查故障台账同症状记录。
线 3:裂图第四次复发——根层收口
排版 HTML 里图片不显示。这 bug 本人记得改过三次,我也记得。这次的现象是:包内公众号排版.html 里 <img src> 写的是本地绝对路径(/api/assets/370/image?rel=D:\code\thinking\...),在 /raw 页面渲染时 404。
根因不是路径写错一处,是图片闸含 img 即盲放:排版校验只检查"有没有 <img>",不检查每张 src 是否落在包内。修复两件:①包内图片绝对路径改写为包内相对路径,/raw→/image 链路实测 200;②图片闸升级为含 <img> 时逐张校验 src 必须在包内且存在——这是本类 bug 第四次复发后的根层收口(e0e19a1)。
线 6:复制标题/摘要——真实物料教做人
详情页标题 Top5/摘要行要加"复制标题/复制摘要"。查 DB 发现 asset.section 全 NULL,老"复制"按钮拷的是整个 yinliu_meta 全文——无用,直接替换。后端新接口 /api/assets/{id}/copy_text:title_top5 取综合首选单条,zhaiyao 取小节纯文本。
第一版只覆盖了一种 meta 格式就交付,curl 真实存量包时暴露:yinliu_meta 的"综合首选"实际有三种写法(A=**综合首选【推荐】**:标题(方法,92分)、B=**综合首选:C1 标题** — 方法:…、C=**综合首选**:A「标题」)。补全兼容后,本人又指出摘要带着"文章总结:"栏目前缀,再补剥除。最终存量三包(团队#27/踩坑#10/团队#38)curl 实证通过,pytest 164→166 绿(53a8c0c/b1bc7e5)。
教训:解析器类功能交付前必须用存量真实数据全量过一遍,单测覆盖的两种格式是我自己造的,不是世界造的。
线 7:CSDN 公网版——垃圾功能果断移除
详情页六件物料里挂着"CSDN公网版 🔴缺件"。本人原话:"这个公网版本应该没什么用的吧?之前是为了图片复制,建立出来的垃圾功能,移除。"
查实确为早期图床方案的遗物(图片已走自动上传,CSDN 上传链路早不依赖它)。删 fabu_public_images.py(720 行含 21 条测试)、assemble/dal/models/前端摘 csdn_public_md 口径、DB 删 asset 350,pytest 145 绿(07a2370)。
线 8+9+10:发布记录与数据报表——三连追击,150→235
这是今天的主菜,三次报障一层比一层深。
第一报(本人原话):"归档的发布记录里面全是空的。" 查下来两层断裂:①backfill 匹配源只认台账标题 + 8 月手工物证表,而实际发布标题取自包内候选池——永远配不上;②就算匹配上,代码也只回填 url 不翻状态(读代码时我第一遍还漏看了这个 else 分支,先跑 apply 才发现)。修复:匹配源加包内 yinliu_meta 候选(109 条)+"采集核销"动作(待发 + 采集目击即翻已发)。已发 125→150(34c5be9)。
第二报:"数据报表,好久没更新过了。" 查下来是口径盲区:月报只统计"已发",窗口内新发的篇目无基线一律记"缺失"。修口径:窗口内新发按发布即 0 基线,月增=期末累计;窗口前已发无基线仍记缺失不冒充 0。重灌 09-19~29 快照,9 月篇目 0→8 篇带数(46ba15b)。
第三报:"9 月我们不是发了不少文章了?"——8 篇对不上本人的体感。继续挖,物证抽取有三个盲区:①候选编号正则只认字母+数字组合,单字母 A 整包漏;②只抽表格不抽 TopN 列表;③全粗体 **角色|标题** 写法不解。外加相似度匹配时同 item 多变体互杀 margin。逐个修:编号正则改 ^(?:[A-Za-z]\d*|\d+)$、角色表行、bold 块按|拆段、相似度按 item 去重再比 margin、8 条人工核对变体入 EXTRA_EVIDENCE。9 月全快照(09-01~29)重跑:已发 150→235,月报 9 月篇目 8→21 篇全带数——团队#20 月增阅读 2039、团队#25 1071、团队#33 904;踩坑#10 当天 13 点发布即自动核销 5 平台(27616e8)。
中间还有个自伤插曲:过滤词里的"评分"把真标题"五维评分双向打分"误杀——自己的过滤器吃掉了真标题,后改为只滤角色词。
略写三线
- 线 4 禁预告(fca8b6f):本人指令"上一篇下一篇的这种承诺不要了",yinliu 产线规则 7.6/7.7 + 素材卡模板删预告行,踩坑#10 四件成稿删承诺句,/raw 实测零残留。
- 线 5 打开文件夹(90f00c6):详情页 fabu 物料卡头部加按钮,与发布包中心/今日待办同口径,fabu_dir 已登记才渲染。
- 线 1 见上。
做得好的地方
- 一句话报障 → 根因的转化率:三次报障("全是空的"/"好久没更新"/"发了不少了吧?")每次都挖到结构性根因并当天修复带实证,不是头痛医头。
- 实证链完整:每个 commit 都带 pytest 全绿 + curl/快照重跑的新鲜数字(125→150→235、0→8→21),无"改了就算修了"。
- 本人判断果断:"垃圾功能移除""质检流程后台做掉"——两次裁定都省掉了维持僵尸功能的成本,合计删 720+ 行。
复盘与改进
- AI 侧最大失分:交付前不用真实存量数据验证。标题解析三种格式、候选编号单字母、"评分"误杀真标题——三个漏全是同一类:拿自己造的样例当全世界。改进:解析器/抽取器类功能,交付标准加一条"存量全量过一遍"。
- 改动前查台账没养成肌肉记忆:CREATE_NO_WINDOW 是 9-08 明文记过的雷,直接踩。改进:spawning/编码/进程类改动,查台账列为前置步骤。
- 读代码漏分支:backfill "只回填 url 不翻状态"是 else 分支,第一遍读漏了,apply 跑完才发现。改进:修"状态不流转"类 bug 时,把状态机所有分支列出来再动手。
成长评估
| 维度 | 分 | 证据 |
|---|---|---|
| 指令与提示词质量 | 8.5 | "归档的发布记录里面全是空的""数据报表,好久更新过了""9 月我们不是发了不少文章了?"——三句口语报障零背景交代,句句可直接定位子系统;纠偏仅 2 次小口径(摘要前缀、格式 C) |
| 判断与结论 | 8.5 | "垃圾功能移除""质检流程后台做掉就好"两次功能生死裁定准确果断,查实后均成立 |
| 思维方式 | 8.5 | 体感对不上数据("发了不少了吧?")不当错觉处理,坚持追到第三层根因,这是今天价值最大的一问 |
| 最终结果与产出 | 9 | 十条线当天全收口,12 个 commit,pytest 全绿,已发 150→235 实证 |
| AI 协作能力 | 8 | 拾取 JSON + 原话的报障方式效率极高;但 AI 三次被真实数据抓漏,协作成本集中在返工验证 |
AI 自评失分点:①标题解析只覆盖一种格式就交付;②_CANDIDATE_ROW_RE 初版 \d+$ 漏单字母编号,整批包物证静默缺失;③"评分"进过滤词误杀真标题;④读 backfill 漏 else 分支,先跑 apply 才发现不翻状态。
指令实证 1:"这个公网版本应该没什么用的吧?之前是为了图片复制,建立出来的垃圾功能,移除。"——一句话给出历史背景(为什么建的)+ 定性(垃圾)+ 动作(移除),AI 零反问直接执行,删 720 行零返工(证据:commit 07a2370)。
指令实证 2:"9 月我们不是发了不少文章了?"——一句体感质疑触发最大价值挖掘:物证抽取三盲区修复,已发 150→235、月报 8→21 篇(证据:commit 27616e8 + 快照重跑)。说明"数据与体感不符"类报障应默认升级为全链复查,不当孤例处理。
素材点
- "已发 150→235"是媒体稿好数字:一次回填链修复让两个月的发布真相浮出。
- "自己的过滤器吃掉真标题"("评分"误杀"五维评分双向打分")是自伤型 bug 的好案例。
- 改 bug 模式十条线一天的吞吐量,可作"人机协作改 bug 工作流"的实证素材。
- 悬而未决:团队#22 掘金/CSDN 显示"6000 万 token"而包内首选是 5000 万,数字矛盾未敢自动核销,待本人核实。
