admin
|
ed9ed847bd
|
session-mechanism:B⑦ 补「同源判据要做变异对照」(2026-10-15 实测过恒绿)
自审时新写的同源判据第一版只认加粗形态 `「**词**」`,而 01-文档索引.md 里不加粗
⇒ 抓成空集、判据永远绿,第一次变异对照没报红。把这条教训写进 B⑦ 配套。
|
2026-10-15 23:35:55 +08:00 |
|
admin
|
5c5272569f
|
session-mechanism:按 21 条总表自审 05/06,修掉 7 处自身违规
用 06 自己的判据过了一遍 06 与 05,查出并修掉:
- ㉑ 一页纸:06 原文 134 行 > 120 ⇒ 压到 113 行(合并重复段、删重复触发词)
- ⑥ 单一真源:05 的 ⑤~⑨ 与 06 的 A②③④⑤/B⑨ 逐字重复 ⇒ 05 改采读数,判据指回 06
- ⑥ 单一真源:总表 A/B/D 的判据列与正文 12 项重复 ⇒ 改成锚点(判据正本在正文)
- ⑧ 命名一致:正文「工程/结构/表述层」vs 总表「A/B/C/D 层」⇒ 统一成 A/B/D,并写明 C 层来路
- ⑨ 不自相矛盾:入口段与「一句话调用」各列一份触发词 ⇒ 合并到入口一处
- ⑦ 注入面同源:SKILL.md 写「技能太长」、06 写「技能太长了」⇒ 统一
- ④ 路径形态:05 引 06 缺 references/ 前缀;06 引 selftest.py 缺 scripts/ 前缀;跨根路径改正斜杠
新增自测 t_skill_entry_triggers_same_source(10 项):SKILL.md §0 ⑧⑨ 的触发词与
05/06 文首集合相等,且 01-文档索引.md 里列的词 ⊆ 真源。
已做变异对照(SKILL.md 改一个字/索引里塞一个真源没有的词 ⇒ 报红;复原 ⇒ 绿)。
|
2026-10-15 23:33:44 +08:00 |
|
admin
|
d8be643ec7
|
session-mechanism:05 改名消歧 + 新增 06「技能优化规程」(含 21 条总表)
- 05-技能梳理规程.md → 05-技能库盘点规程.md:本规程只管「库」(有哪些技能、在用没用、该不该入仓)
- 新增 06-技能优化规程.md:一句话判据「写技能时,假设读者是另一台机器上的另一个会话」;
三层 12 项(工程/结构/表述)+ 末尾「技能优化描述 · 总表」21 条四层
(合并 mcn-short-video/技能审计检查清单.md 的 13 项流程维度并去重)
- SKILL.md §0 增第 ⑧⑨ 项;01-文档索引.md 增两行;两篇入口触发词划清边界
|
2026-10-15 23:14:25 +08:00 |
|
admin
|
68b56a0720
|
session-mechanism:新增「技能梳理规程」(一句话可调用)
用户令:「找进10天所有 梳理技能的要求和描述,看能找出哪些,考虑在会话技能中加入
技能梳理规则,可以一句话调用」
一、梳理了近 10 天(10-06 ~ 10-15)所有「技能梳理」类要求,来源两处:
· 本地日志:10-07「技能"已无作用"梳理」(判据=实际被加载过几次,产物 交付物/技能清单-20261007.md)、
10-11「技能库待提交清单盘点」「技能包脚本把机器路径写死」报障、10-14「包内代码一律相对路径」、
10-15「技能根绝对路径清零」;
· 历史对话(8 条命中):技能库清理/browser-harness 重写、审计所有技能相关机制、
按白名单收回误入库技能、撤出 roots.env/manifest.md 等本机契约、「把产品规划技能整理成唯一形态」、
「全局技能文件只有一个地址 其余旧的都删除」等。
二、归纳出 11 项可执行检查,落成 `references/05-技能梳理规程.md`(编号接续 00~04):
· 先测再判:① 盘点技能根下每一层(含非技能散件)② 判在用/没用(判据=实际被加载次数,扫转录)
· 分类:③ 按"删了会丢什么"分四档 ④ 查功能重叠
· 查隐患:⑤ 白名单 ⑥ 本机生成契约误入库 ⑦ 入库代码写死本机 ⑧ 路径形态
⑨ 正文自相矛盾 ⑩ 多副本(唯一形态)⑪ 待提交清单
· 输出:产物落 `交付物/技能清单-<日期>.md`,必须含「这份读数能说明什么、不能说明什么」
三、开头摆两条已证的坑(都来自这 6 次实操):
· 零值必须先自证 —— 10-07 指纹写错(技能名被转义引号包着)⇒ 读数全 0,连当天刚加载过的
session-mechanism 都是 0;拿已知非零样本做对照是本规程每一步统计的必备第一步。
· "在册" ≠ "在跑" —— 判机制生效看新鲜调用时间戳。
四、一句话调用:SKILL.md §0 新增第 ⑧ 项触发词(「梳理技能」「盘点技能库」「技能库体检」
「技能清理」「梳理一下技能的要求和描述」任一句即触发);`references/01-文档索引.md` 同步加行。
⛔ 规程只交「清单 + 分档 + 读数」,删/改/并的判据只有用户能给。
⛔ 全部用肯定表述(写「要什么、怎么做」)。
验收:manifest 重算 81 份、语法失败 0;全量自测 PASS 110 / FAIL 0。
|
2026-10-15 23:00:47 +08:00 |
|
admin
|
74b407ccba
|
session-mechanism:加「锁根不得落进技能包」红线判据
按决策方法论自决(加判据属"实现路径",⛔ 不列入待拍板)。
新增 `session-rules-check.py::check_lockroot_in_pkg()`,注册进体检 A 组:
查 `<技能包>/05-交接单/` 与 `<技能包>/scripts/05-交接单/` 是否被创建
(三个根都查:脚本所在包根、全局技能根下的 session-mechanism、本区技能根下的同名目录)。
为什么是红线:`lock/handoff-guard.sh` 与 `lock/preflight-lock.sh` 的 `DOCS_ROOT`
原先回落到 `$_SM_HERE/..`(=技能包自己的 `scripts/`)⇒ 取不到文档库根时锁目录长在包里
(另一环境实测已出现 `<技能包>/scripts/05-交接单/.locks/`)。后果两条:污染只读发布物;
换工作区后锁跟错地方 ⇒ 域锁静默失效。
两处回落实已改为「取不到就报错 + 留痕 + 退出码 2」(9b839e7 / 22799fc);本条是兜底判据。
变异对照(⛔ 证明它抓得住、不是恒绿):
· 常态 ⇒ `✓ [A] 锁根未落进技能包`
· `mkdir -p <技能包>/scripts/05-交接单` 后 ⇒ `✗ [A] 锁根落进了技能包 ⇒ …`
· `rmdir` 复原 ⇒ 回到 ✓
⛔ 未做成 selftest 自动化用例:那要求真在技能包里造目录,用例中断会把 `05-交接单`
永久留在包里(不可逆污染)。⇒ 保留为判据 docstring 里可手工复现的步骤。
验收:语法 OK;全量自测 PASS 110 / FAIL 0。
|
2026-10-15 22:50:46 +08:00 |
|
admin
|
9b839e7a02
|
session-mechanism:决策判据补每轮通路 + preflight-lock 补回落修复
用户问:「为什么决策方法 每次都要说一遍才会加载,是否需要把它纳入 hook」
一、根因(实测,⛔ 不是猜)
`decision-rules-hook.py` 早就存在、也早就接线(SessionStart,install.py 声明表第 11 条),
但它**只挂 SessionStart** ⇒ 会话开头注入一次,而**长会话被压缩后那段会一起丢掉**。
本机实测:一个由压缩接续而来的会话,上下文里**没有**那段注入。
用户的会话基本都很长 ⇒ 每次都丢 ⇒ 外在就是「不点名就不加载」,
而 `skill-load-guard.py` 只在**点名时**才提醒 ⇒ 形成「必须说一遍」的循环。
二、修法(零新增进程)
`decision-rules-hook.py` 增加 `UserPromptSubmit` 分支,注入极短版 `RULES_BRIEF`(四行);
由 `prompt-guards.py`(UserPromptSubmit 的多守卫合并入口)把本文件作为**第 5 个 guard**
合进同一进程调用 —— 实测 `decision=0.002 s`,⛔ 不新增 Python 冷启动
(该入口存在的理由正是"别再往 UserPromptSubmit 上串新进程")。
全量仍在 SessionStart 那份;每轮只补"最常被违反的四条"。
三、preflight-lock.sh 补回落修复(22799fc 漏了它)
`DOCS_ROOT` 的回落原与 `handoff-guard.sh` 同款(`$_SM_HERE/..` = 回落进技能包 `scripts/`)
⇒ 现改为「取不到就如实报错 + 留痕 + 退出码 2」。
⚠️ `handoff-guard.sh` / `lock-guard-hook.py` / `collabd.py` / `install.py` 四处已由 22799fc 落地。
验收:
· 语法:两个 .py 走 ast.parse、两个 .sh 走 bash -n(PortableGit 1.3.0)—— 全过
· 实跑 `prompt-guards.py`(UserPromptSubmit 载荷):注入 2387 字符,含「决策判据 / 技术实现自己定 /
只提报用户三类 / 回复排版闸门」四项;各 guard 耗时 0.002–0.013 s
· 实跑 `handoff-guard.sh --status` ⇒ `root=D:/github/dsh_shenxian/dsh-server-docs`(正确落文档库,⛔ 不是技能包)
· 实跑 `collabd.py --domain-status` ⇒ 正常列出在册域锁(读侧已能读到锁)
· 全量自测 PASS 110 / FAIL 0
|
2026-10-15 22:44:59 +08:00 |
|
admin
|
22799fc9c2
|
session-mechanism:解析不到文档库根时如实报错留痕(第 11 条禁令)
⚠️ 这批改动**不是本次会话写的**,是本机协作机制里别的会话留在工作区的;我按用户「就可以提交仓库」
的授权一并入库,提交前只做了语法校验 —— 三个 py 过 `py_compile`,`handoff-guard.sh` 过 `bash -n`。
- `install.py` `write_roots()`:`DSH_DOCS_ROOT` 解析不到时,原行为是**整行不生成、不报错、不留痕**
⇒ 锁类脚本读不到该键 ⇒ `handoff-guard.sh` 回落到技能包自己的 `scripts/` ⇒ 锁根落进技能包
(另一台机器实测已在 `<技能包>/scripts/05-交接单/.locks` 长出一把锁)。现改为**如实报错 + 留痕**,
并写明「本区确实没有 dsh 文档库时就写本工作区根」这条出路。
- `collabd.py` / `hooks/lock-guard-hook.py` / `lock/handoff-guard.sh`:同批配套(68 增 / 12 删)。
|
2026-10-15 22:40:14 +08:00 |
|
admin
|
f2d07b47ad
|
product-planning:修掉④段改六节后遗留的 5 处内部矛盾(用户选 A 方案)
改成六节后,④段包内还有旧口径没跟上,逐处修掉:
1. ④段 SKILL.md「定位」节:删掉「第一层轴默认按用户路径分段…也可按原型实际状态分段」,
改为「两份产物都按六节组织、骨架与模板同构,⛔ 不按状态轴分段、也不把界面状态当文档层级」。
2. ④段 4a 子步:产出由「第一层轴 × 使用场景清单 + 需求编号」改为「页面清单 P + 场景清单 S +
功能清单 F + 二级功能 J,编号先占好、各自唯一并按展示顺序通排」。
3. 🔴 `references/doc-area-spec.md` 整份按六节重写(原 76 行讲的是旧版「第一层轴 → 场景 →
横向流程图 → 三段说明:功能作用/输入边界/异常情况」,正是主 skill 沿革条已明令停用的那套)。
新版:六节怎么落进原型/场景怎么写/横向流程图规则/每项功能的四项要求(做什么·入口在哪·
输入边界·异常与恢复)/文案红线/自查九条。原文件里有价值的流程图表格规则与文案红线四条保留。
4. `references/doc-language-spec.md` 开头:文档骨架由旧四块改为六节。
5. `funcOnly` 补定义:在原型上点不出结果的场景标 funcOnly(只写进功能清单、不画流程),
并在第六节的待确认表里写明为什么点不出来;④段完成标准与 doc-area-spec 自查各一处。
- 验收:grep「第一层轴/三段是固定骨架/需求编号/需求列表/四块」在④段内残留 0(_留痕 除外);
check_naming.py --ws E:/ProgramData/AIProject/contentm_agent = 通过 225 / 失败 0 / 提示 27;
工作区 CRLF 文件数 0(新建的 doc-area-spec.md 已转 LF)。
|
2026-10-15 22:05:34 +08:00 |
|
admin
|
5afeb6b78a
|
④段整套同步(六节 + P/S/F/J + 模板)+ open-design 移到技能根
一、④段整套同步(用户选候选 A)
- 新增 `references/stage-proto-doc/assets/产品文档模板.html`(16 KB/247 行,从备份拷、转 LF)。
- ④段 SKILL.md 换成备份 15:28 那版,并按模板口径改齐:
· 「产品文档框架」从「四块+一附录」改成**六节** —— 页面结构/功能清单/使用场景/操作流程/
跨页与界面状态/待确认与偏离;与模板同构,⛔ 不从空白页重写结构。
· 编号从 R/S/F 改成 **P 页面/S 场景/F 功能/J 二级功能**,各自唯一、按展示顺序通排。
· 保留旧版有价值的要求:每项功能补齐 做什么/入口在哪/输入边界/异常与恢复;重点功能三处标红;
横向流程图每步写清页面/功能/操作/完成判据。
· 完成标准「七节」→「六节」,自查清单同步换掉「需求」那批条目,补模板与配图两条。
· 路径 `designs/<项目>/` → `docs/pm/<项目>/ui/`(2 处)。
· 补回本机那条「每份产出文档开头都要有一张图」的引用(指向主 skill,段内不复述)。
- 主 skill 同步:四段结构表④行、④段沿革、画图小节(④段画页面结构图 + 用户路径)。
二、open-design 移到技能根(用户选候选 A)
- `git mv product-planning/references/stage-delivery/assets/open-design → open-design/`(4178 文件)。
- `.gitignore` 白名单加 `!/open-design/` —— 否则移出去就不再纳入版本控制。
- 引用改 11 处:路径形态 `assets/open-design/...` → `<技能根>/open-design/...`;
「随段携带的自带件」改称「同根技能」;「路径怎么找」那条改成自带件(段内相对路径)与
同根技能(`<技能根>/<技能名>/`)两类分开写。
- open-design 自己的 ATTRIBUTION.md 两处同步(它现在与 oil-ui-pro 同层)。
- 副作用(有益):命名闸门读数由 2063 降到 225 —— 此前它把 open-design 里 919 个第三方 md
当成规则一起扫了;现在只扫本包 23 个 md。已确认④段的 H1 与 4a/4b/4c 子步仍在检查范围内。
三、验收
- check_naming.py --ws E:/ProgramData/AIProject/contentm_agent = 通过 225 / 失败 0 / 提示 27。
- 活文件里 `assets/open-design` 残留 0;工作区 CRLF 文件 0。
|
2026-10-15 21:17:28 +08:00 |
|
admin
|
fa0a9026c8
|
product-planning:从备份补回两条排版红线(标题周围不写小字 + 图是正文)
来源:E:/技能备份/product-planning(该备份 10-15 15:2x 被更新过,比本机 09:45 新)。
逐文件比对(含 20 份相同 / 13 份不同,已排除 assets/)后,只取这两条:
- 「标题周围不写小字」:备份的 SKILL.md 有、本机完全没有的一条 —— 2026-10-14 用户令,
原话「标题周围写小字的怪毛病 彻底改掉」。写明元信息写进表格的列/条目的字段/表头,
标题旁边、下面、后面只放标题本身。
- 「图是正文内容」:补进「产出文档开头必须有图」一节 —— 图⛔ 不写成标题旁边或标题下面的注解小字。
⛔ 其余不同步(备份是另一条分叉的线,不是本机线的后续):
· 备份总入口仍是旧口径(designs/<项目>/、旧④段描述、$CODEBUDDY_CONFIG_DIR 绝对路径 —— 违反 10-14 令);
· 备份③段「自带样式库不止调色板级(含 9 板块整页快照 / 345 组件族 / tiaoyue-all.css)」那条是 2026-10-13
订正,但本机 design-system-tiaoyue 下实测**没有** component-library/、snapshot/、gallery.html、
tiaoyue-all.css ⇒ 照搬会变成不实陈述,本机保持 2026-10-08 实测那条(只到调色板级);
· 备份②段「新功能放在已有产品的哪一页」—— 本机用「宿主哪一页」(2026-10-13 用户令),以本机为准;
· 备份缺「宿主」那一环,总体比本机的线旧。
- 验收:check_naming.py --ws E:/ProgramData/AIProject/contentm_agent = 通过 2063 / 失败 0 / 提示 27;CRLF 文件数 0。
|
2026-10-15 21:07:12 +08:00 |
|
admin
|
50db9068d2
|
product-planning:立「每份产出文档开头必须有图」(用户 2026-10-15 令)
- 主 skill 新增一节 `## 产出文档开头必须有图(单一真源)`,写明:图放标题之后、正文之前;
按段定画什么(①段画对象与流向/②段画页面骨架/③段画页面结构与操作动线/④段画用户路径与四块怎么串);
画图用 `diagram-design`,⛔ 不手写 Mermaid;图与正文必须对得上。
- 四个 stage 的「硬约束」各加一条引用,指向该节 —— ⛔ 各段不复述口径(单一可信源)。
- 主 skill「反面清单」加一条:落盘文档开头不给图、或图与正文各说各的。
- 验收:check_naming.py --ws E:/ProgramData/AIProject/contentm_agent = 通过 2063 / 失败 0 / 提示 27;
工作区 CRLF 文件数 0。
|
2026-10-15 09:46:13 +08:00 |
|
admin
|
db52965ba5
|
product-planning:去 AI 味判据一律改用英文目录(用户 2026-10-15 令「都用英文判据」)
- 判据来源明定为 `humanizer` 的**英文正式目录** `references/patterns.md` 的 P1–P55
(内容 8/语言与风格 10/沟通 3/填充与模糊 9/新兴 13/工艺与取证 12),只此一份。
- ⛔ 中文附录 `patterns.zh.md`(ZH1–ZH15)降为**参考线索、不作判据** —— 作者自标
「实验性、未经中文母语写手校验、不应被当作已验证的规则」。
- ⛔ 原中文版 `humanizer-zh` 的 24 条与五维 50 分表随该技能删除一并停用;「五维里真实性按…读」
那条删除,改成「已停用」一条。
- 门槛按语言分两路:
· 英文产出 ── 可读 `--score` 的 0–100 AI 痕迹密度分(越低越像人;上游 pre-commit 拦截线 40),
本包不设硬阈值,分数写进段末报告。
· 中文产出 ── ⛔ 不采信自动分数(该打分器按 [.!?] 切句、[a-z0-9] 切词,中文 。!? 不切句、
汉字零词,分数实际在测「文件里有多少拉丁字符」;实测:把 。 换成 . 分数不变,零拉丁字符
的中文直接判 No text)⇒ 改按 P1–P55 逐条人工对照 + `--check-facts` 保真(抽数字/日期/版本/
URL/路径/标识符,中文同形可用)。对照结果与事实存活数写进段末报告,命中项不对完不许落盘。
- ①段 stage-discovery 的写作口径同步:不再说「中文模式在 patterns.zh.md」。
- 验收:check_naming.py --ws E:/ProgramData/AIProject/contentm_agent = 通过 2063 / 失败 0 / 提示 27;
工作区 CRLF 文件数 0。
|
2026-10-15 09:38:47 +08:00 |
|
admin
|
dec7d9c491
|
删掉说人话中文版 humanizer-zh,只保留英文版 humanizer(用户 2026-10-15 令)
- 删 `humanizer-zh/` 整目录(LICENSE / README.md / SKILL.md 三件);技能仓有 git 记录,可回退。
- 同时从本仓 .gitignore 白名单去掉该条目。
- 理由(承接上一轮排查):该技能除模式清单外,那节「个性与灵魂」要求「有观点/加第一人称/允许跑题、题外话」,
与产品文档要的客观书面说明文相反;英文版 humanizer 的自带中文附录足以承担模式对照。
- product-planning:判据来源改为**只有 humanizer 一份**(英文 P1–P55 在 references/patterns.md、
中文 ZH1–ZH15 在 references/patterns.zh.md,并注明该附录作者自标「实验性、未经中文母语写手校验」);
⛔ 原「评分取 humanizer-zh 五维表」一条作废 —— 中文自动评分本包已无可信来源
(humanizer 的打分器按拉丁字符切词,中文得分是假信号)⇒ 改为**模式清单人工对照 + 五维人工评分 ≥45/50**。
「五条核心原则」原引自 zh 版《核心规则速查》,英文版 Quick reference 无等价条目 ⇒ **就地固化在本包**。
「适用面要划清」一条改为只点 humanizer 的 Soul Injection Techniques。
- ①段 stage-discovery 的写作口径改指向「执行规则 · 内容准则」,不再指向已删技能。
- session-mechanism 三处引用改写:规则来源改为本包 04 号 + 内嵌 references/humanizer-en/;
04 号与 SKILL.md 里「通用版在独立技能 humanizer-zh」两句标为作废(该包自带两份,不依赖外部)。
- 改包纪律.md 的「判为不需要」清单去掉该技能名。
- 验收:check_naming.py --ws E:/ProgramData/AIProject/contentm_agent = 通过 2063 / 失败 0 / 提示 27;
活文件里对 humanizer-zh 的剩余出现全部是「已删除、不再引用」的沿革说明;工作区 CRLF 文件数 0。
|
2026-10-15 09:33:48 +08:00 |
|
admin
|
80ddf1220d
|
session-mechanism:硬档处置钉死「必须建接续会话 + 报 automation id」
用户选 B 方案(只改规则文字,不加自测判据)。
改的是 `session-log-guard.py` 日志硬档(8 MiB)的处置文案:
· ③ 由「建接续会话」改为「🔴 **必须建接续会话**」,并加「**建完把 automation id 写进
给用户的最后一条回复**」;
· ④ 告知语补上 id:「已登记自动接续(automation id `xxx`),约 N 分钟后自动开新会话」。
为什么必须有这一句(实测缺口):2026-10-14 本会话已到三级告警(`.budget-alert-level`
记 `23715e76…→ 3`),而接续会话**一封都没建** —— 宿主库里名字/提示含「接续」「交接」
的排期命中 **0 条**。根因是钩子只负责「叫」(源码明写「钩子开不了新会话」),
建会话得由会话里的模型走一次性 automation;少了「必须建 + 报 id」这句,
叫完仍然可能没人建。
⛔ 不动架构文档:references/architecture.md §③ 讲的是接续会话的**命名规范**(标题怎么起),
与本处「是否必须建」互补、不冲突。
验收:全量自测 PASS 110 / FAIL 0(确认没有判据锚定改的这两句)。
|
2026-10-15 09:32:57 +08:00 |
|
admin
|
f53d86dd4b
|
product-planning:产物路径统一到 docs/pm/<项目>/ui/ + 划清「说人话」的适用面
一、路径统一(用户 2026-10-15 选 A)
- 活文件里 designs/<项目>/ 一律改 docs/pm/<项目>/ui/,共 22 处(SKILL.md 10、③段 SKILL.md 6、
execution-runbook.md 4、④段 SKILL.md 2);_留痕 下两份历史存档不动。
- 「项目与路径约定」里那句重写:slug 就是 docs/pm/<项目>/ 这一层的目录名,各段产物挂在它下面
(①research/ ②prd/ ③④ui/ 跨段 专题/)。
- 依据:技能里「文档的两态」早就写「方案文件夹=docs/pm/<项目>/,含①research/ ②prd/ ③ui/」,
而「产物落哪」表与各段正文写的是 designs/<项目>/ ⇒ 技能内部两套口径打架;两个真实项目
(contentm_agent / ai1net-dsh-server)的原型实际都在 docs/pm/<项目>/ui/,designs/ 目录并不存在。
二、划清「说人话」的适用面(用户要求排查后立的)
- 排查结论:两份技能都有「注入个性」那半 —— humanizer 的 Soul Injection Techniques(11 条,
含「有观点/加感官细节/允许跑题/结尾不必收束」)、humanizer-zh 的「个性与灵魂」(含
「有观点/适当使用我/允许一些混乱:跑题、题外话、半成型的想法是人性的体现」)。
照它写会出乱比喻与口水话,与产品文档要的客观书面说明文相反。
- 改法:内容准则里加一条「适用面要划清」——只取「去 AI 味」那半(模式清单/五条核心原则/
禁用清单/五维评分);⛔ 不取两节「注入个性」;口吻档固定 technical;五维里「真实性」按
「不机械生硬」读。另加一条「同一件事更严的那份说了算」:④段 doc-language-spec.md 是本包最严的
语体规范,冲突以它为准。反面清单加一条。
- 验收:check_naming.py --ws E:/ProgramData/AIProject/contentm_agent = 通过 2063 / 失败 0 / 提示 27;
工作区 CRLF 文件数 = 0。
|
2026-10-15 08:33:50 +08:00 |
|
admin
|
d383876d89
|
product-planning 总入口:④段那行概括补上本段核心结构(按用户路径分段;每段四块:需求列表 → 用户场景 → 操作流程 → 功能),与段内正文口径完全对齐
|
2026-10-15 08:28:16 +08:00 |
|
admin
|
f64a172b5a
|
product-planning:用备份里的新版④段装回(四段恢复),替换 10-14 删掉的旧版
- 来源:E:/技能备份/product-planning/references/stage-proto-doc/(4 份,与备份逐字一致,md5 逐个核过)。
- 新版与旧版的差别:新版定位改成「解释与记录**现有**原型,不重新规划产品、不重新设计界面」;
交**两份产物**(原型内嵌说明区 + 独立产品文档 designs/<项目>/产品文档.html);
内容按「需求列表 → 用户场景 → 操作流程 → 功能」四块 + 附录「原型页面地址」铺;
配 R/S/F 编号体系与三份方法论(doc-area-spec / doc-language-spec 322 行 / guided-tour)。
旧版那套(状态轴、三段必填、逐步骤演示)不再使用。
- 总入口 SKILL.md 同步改回四段:description、「四段结构」表(④子步=4a 场景盘点 / 4b 说明区 /
4c 演示引导(可选))、交接口加 ③→④、产物落哪加④行、进入方式加回两行、只读清单加④条、
执行规则与反面清单(加回两条:③别顺手写说明区/产品文档、④别重新规划产品);段名链恢复
「产品 / 功能 / 界面 / 说明」;留痕位改写为④段的完整沿革(10-14 删旧版 → 10-15 装新版)。
- ③段 stage-delivery:「与④段的界」改回(③造物、④解释与记录),两处约束改回「说明区与独立产品文档归④段」,
反面清单加回一条。①②段的段名对称链与越界条目改回四段。
- 闸门 check_naming.py:STAGES 恢复 stage-proto-doc(圈号数组回 ①②③④、交接口回三条边、
子步例外列表回 4b/4c),DEPRECATED 去掉④段名(段名与子步名仍在使用)。
- 补入配套留痕:references/_留痕/stage-proto-doc-SKILL-20261014-替换前.md(旧版 SKILL 存档,转 LF)。
- 验收:check_naming.py --ws E:/ProgramData/AIProject/contentm_agent = 通过 2063 / 失败 0 / 提示 27。
|
2026-10-15 07:58:14 +08:00 |
|
admin
|
956382944d
|
立「问 GPT 只给关键背景」的提问口径(product-planning 主 skill 为权威处)
- 用户令(2026-10-15 逐字):「问 GPT 的时候 只需要说明 关键背景情况和需求询问,禁止带入过多细节上下问造成干扰」。
- 落点:`product-planning/SKILL.md` 新增「## 征询外部模型(GPT)的提问口径(单一真源)」——
要写三样(场景一句 / 手上已有什么 / 想问哪几个问题)、判据(少了这句对方就问不出对的问题吗)、
⛔ 不带清单(过程留痕 / 废弃做法细节 / 来龙去脉 / 内部约束清单 / 字段与文件清单)、
避坑依据(10-14 那次 1 500 余字背景的反例)、留痕要求。反面清单同步加一条。
- `browser-harness/SKILL.md` §3「提问怎么写」同步收紧:原「给完整上下文」改为「给必需的上下文」
+「上下文写到对方能接住这个问题为止」;此处保持通用表述,不带产品规划语境(口径本体在 product-planning)。
- 验收:`check_naming.py --ws E:/ProgramData/AIProject/contentm_agent` = 通过 2045 / 失败 0 / 提示 31。
|
2026-10-15 07:38:39 +08:00 |
|
admin
|
daf4e5675a
|
product-planning:删掉④段「原型说明文档」(用户令「第4部分完全没法用,都删除」)⇒ 四段改三段
- 删 references/stage-proto-doc/ 整目录(SKILL.md + references/doc-area-spec.md + references/guided-tour.md)。
原做法=往原型 HTML 注入说明区注解层(场景 / 从左到右流程图 / 功能作用·输入边界·异常情况 三段说明 / 演示引导),实测不好用。
- 总入口 SKILL.md:description 与「三段结构」表、交接口表(去掉 ③→④)、产物落哪(去掉④行)、
进入方式(去掉「只做原型说明文档」「已有原型,要补说明」两行)、只读清单、执行规则、反面清单同步改写;
并在段名命名原则处留一条删除留痕(含用户原话与「新写法待定」)。
- ③段 stage-delivery:撤掉「与④段的界」一条,改掉「说明区归④段」的两处约束(3d 完即交付原型本身);历史条目加注。
- ①段/②段:段名对称链与越界条目改成三段。
- 闸门 check_naming.py:STAGES 去掉 stage-proto-doc(圈号数组改 ①②③、交界边去掉 ③→④),
DEPRECATED 收进④段名与 4a/4b/4c 三个子步名。
- 未动:references/_留痕/ 下两份历史存档(含④段的旧口径,属正当留痕);SKILL.md 与 check_naming.py
里 2026-10-02/10-06 两次事故记录(历史事实)。
- 验收:`check_naming.py --ws E:/ProgramData/AIProject/contentm_agent` = 通过 2045 / 失败 0 / 提示 31
(新增 4 条提示全部落在 _留痕/ 里,正当)。
- 备份:tmp/_backup-stage-proto-doc-20261014/(原目录三件 + 改前 SKILL.md)。
|
2026-10-14 23:33:54 +08:00 |
|
admin
|
2f656098de
|
技能仓:技能根绝对路径清零(用户令:严格禁止技能中写这里绝对路径)
用户原话:「SKILL.md:189 判据源写 E:/ProgramData/.workbuddy/skills/
严格禁止技能中写这里绝对路径(除非跨根目录因引用),跨环境全部报错」
起因:product-planning/SKILL.md:189「判据来源」那句写了技能根绝对路径。
按同一判据全仓反查后清掉 10 个文件:
· product-planning:SKILL.md(判据来源 / video-capture 位置 / 本技能位置 + 新增「路径写相对或占位」规则)、
references/_留痕/SKILL-总入口-20261007改说人话前.md、stage-delivery/assets/video-capture/SKILL.md、
scripts/check_naming.py(注释)
· session-mechanism:SKILL.md(反例改占位 + 例外条款改写:由「文档/注释不在此列」改为「例外只有跨根引用」)、
references/deploy.md(安装目录)、scripts/session-rules-check.py(docstring)、
boards/会话看板/board-launch.py.tpl(模板占位符)
· video-capture:ATTRIBUTION.md(沿革)
· 改包纪律.md:3 条 cd 命令
判据(用户给的两分法):
· 技能根(本包自己 + 同根技能)⇒ 一律不写绝对路径,写 <技能根>/<技能名>/
· 跨根引用(工作区根 / 文档库根 / 本机软件安装位 / 宿主数据目录)⇒ 才落到具体位置,优先读环境变量
验收:
· product-planning 命名闸门:通过 2060 / 失败 0
· session-mechanism 全量自测:PASS 110 / FAIL 0
· 全仓 grep -r 反查该形态:清零(install.log 为运行时产物已 ignore;browser-harness/.venv 为 pip 元数据)
· 3 个被编辑器写成 CRLF 的文件已转回 LF,与 .gitattributes 的 eol=lf 对齐
|
2026-10-14 21:10:29 +08:00 |
|
admin
|
7a08cd3366
|
session-mechanism:相对路径补漏两处(用户令「能用相对路径的都要用相对路径」漏网的)
承接 fe22f4c。上一轮清了 4 处盘符硬编码,本轮复核发现还漏 2 处:
① scripts/hooks/wb-result-hook.py 的 CARE_PREFIX
原写死 "e:/programdata/aiproject/"(盘符 + 用户名进代码)⇒ 换机即全错,
且**域外过滤会静默走偏**(把自家会话判成"域外"、不读转录)。
改:从 env/roots.env 的 DSH_AIROOT 推导(新增 _sm_load_roots(),上跳三级到包根)。
判据=「这个根能不能从『我自己的位置』推出来」—— 推不出 ⇒ 读本包 env/roots.env。
取不到 ⇒ classify() **如实报错 + 打 stderr 留痕**(⛔ 不静默把全部会话判成域外)。
② scripts/selftest.py:6875 假样本里的 "workspace": "E:/selftest"
改为 "__selftest_ws__",与同段已改的两处(__selftest_no_such_ws__ / __selftest_ws__)同族。
验收:
· 有 DSH_AIROOT ⇒ 分类逐样本与改前硬编码**完全一致**
(home / line 客户端线 / line ai1net_ui / other contentm_agent / outside)
· 包不带 env/(拷到别处)⇒ **如实报错 + stderr 留痕**,⛔ 不静默
· selftest 全量 rc=0 · PASS 110 / FAIL 0 · 语法失败 0
|
2026-10-14 16:49:04 +08:00 |
|
admin
|
fe22f4cebe
|
session-mechanism:两个看板定名(会话看板 / 项目看板)+ 包内代码一律相对路径
用户令(两句,同一轮):
①「会话技能中 能用相对路径的都要用相对路径」
②「把会话的 项目目标看板 改成 项目看板,
项目看板 和 会话技能的任务看板 都重新命名 会话看板、项目看板」
## 一、改名:项目管理界面 → 项目看板
* 目录:boards/项目管理界面/ → boards/项目看板/(会话看板不变)
* 包内引用:路径性(3 行)+ 展示名(6 处,含 argparse description、启动横幅、
错误日志前缀、模块 docstring、页面 <title> 与 .brand)
* HTML 标题:<title>项目管理 · 执行任务</title> → <title>项目看板 · 执行任务</title>
## 二、相对路径(新立第 11 条禁令)
判据=「这个根能不能从『我自己的位置』推出来」:
* 能(本包自己的目录)⇒ 从 __file__ 上跳推导
* 不能(工作区根 / 配置目录 / 文档库根)⇒ 读本包 env/roots.env
* 推不出来 ⇒ 如实报错 + 留痕(⛔ 不许静默扫空)
落点(共 4 处代码级硬编码,全部清掉):
* boards/项目看板/project-board.py:新增 _sm_load_roots();
技能根改 HERE.parent.parent;WS_ROOTS 从 DSH_AIROOT 推导;
推不出根时打警告 + 写 logs/project-board.err.log(原为静默扫出 0 个项目)
* scripts/selftest.py:生产区定位改为扫 DSH_AIROOT 下兄弟区(⛔ 不写死区名);
两处测试假路径去掉盘符
⛔ 文档/注释里的绝对路径保持原样(举例、历史取证照写 —— 那是证据)。
## 验收
* 换机场景实测(技能包拷到 /tmp、不带 env/roots.env):
无任何配置 ⇒ 如实报错;只给 DSH_AIROOT ⇒ 正常扫到 4 个项目
* selftest --filter 看板:PASS 110 / FAIL 0(报告型 1 条不计入)
* 项目看板服务:pid 40776 · HTTP 200 · <title>项目看板 · 执行任务</title>
· /api/projects 出数据 · /healthz ok
* py_compile 三份改动文件全过
|
2026-10-14 16:33:28 +08:00 |
|
admin
|
52566c79f9
|
session-mechanism:两个看板整包搬进 boards/(页面与脚本同处一包)
用户令:「把这两个看板都纳入会话技能中,分两个看板文件夹,开个 boards 文件夹放两个看板」
「1 boards 2 A」(文件夹名 boards;本区部署与计划任务本轮一起改)
## 分层(新增第三层)
scripts/ = 可执行程序(被计划任务/hook 调)
assets/ = 静态素材(样式、模板)
boards/ = 自带页面的看板程序(一个看板一个文件夹,页面+脚本同处一包)
## 动了什么
* boards/会话看板/(6 文件):board.py / board_ext.py / board-launch.py /
board-launch.py.tpl / board.html / board-render-probe.js(从 scripts/ 与 assets/ 搬入)
* boards/项目管理界面/(3 文件):project-board.py / project-board.html /
project-board-launch.py(从工作区 交付物/项目管理界面/ 复制入)
## 搬迁带出的真缺陷(已修,非补丁)
* board.py:「与 collabd.py 同目录」这个前提搬走后不成立 ⇒ 原来会**静默**落到
本地抄的那份判据(自测「两侧共用同一实现」判 FAIL,但看板照跑、肉眼看不出来)。
改成候选表(同目录 → 包内 scripts/ → DSH_SKILL_ROOT/scripts/),并在兜底分支**写 stderr 留痕**。
* board.py:CFG_P 同样按 HERE 找配置 ⇒ 与 collabd.py::load_cfg() 对齐查找顺序。
* selftest.py:一个 H 指两处的假设(board.py 与 collabd.py 同目录)拆成 H/B 两参数;
board.html / board.py 全部改走 BOARD_DIR / board_py()。
## 顺带修一条既有 FAIL(与搬迁无关)
* 判据锚点没跟文档改:supervise-persistence.md 措辞在 053a6a6 已改成
「排期按点拉起主会话这条路不存在」,判据仍锚旧句 ⇒ 恒红。判据改成锚档内现存那句。
## 验收
* selftest:--filter 看板 PASS 110 / FAIL 0(报告型 1 条不计入);
全量 PASS 91 / FAIL 1(同一条报告型,实质 FAIL 0)。
* 会话看板 board.py --out ⇒ 50515 字节快照,无「回落本地判据」告警(证明真从 collabd.py 取)。
* 项目管理界面 --once ⇒ 4 个项目全列出;HTTP / 200 · 54102 字节(=技能包真身那份)·
/api/projects 出数据 · /healthz ok。
|
2026-10-14 15:39:41 +08:00 |
|
admin
|
5d16c6df70
|
session-mechanism:SKILL.md 的 frontmatter 改成合法 YAML(内容一字不动)
原写法:`last_change` 是一行超长标量,其后 12 行以 `·` 开头且无缩进,
顶层出现无键的行 —— 那不是合法 YAML;`agent_created` 前面还夹着一行
游离的 `· **本包自身**:…`,同样在顶层无键。
改法:改成块标量 `last_change: |-` + 续行统一两格缩进(含那行游离内容)。
只改写法,内容一字不动。
验证(改前 vs 改后逐字比对):
- 顶层无键行:12 → 0
- last_change 正文 12 行逐字一致
- 正文(第二个 --- 之后)逐字一致
- PyYAML 解析通过,字段=name / description / version / updated_at /
last_change / agent_created,last_change 3358 字符 / 36 行
|
2026-10-14 11:25:39 +08:00 |
|
admin
|
9e779c4889
|
仓级:按新规则重新规范化行尾符(--renormalize)
上一步立了 .gitattributes(text eol=lf),这一步把已入库的文件按新规则
统一成 LF。245 个文件,其中 product-planning 239 个、session-mechanism 6 个。
这批改动**只有行尾符**:`git diff --ignore-cr-at-eol` 对全部 245 个文件
零内容差异,未触碰任何二进制与资源文件。
单独一笔的理由:把"改规则"与"按规则刷数据"分开,将来若有谁的改动撞上,
可以直接对着这一笔回退,而不牵连 .gitattributes 本身。
|
2026-10-14 11:23:56 +08:00 |
|
admin
|
cf0ec41245
|
仓级:加 .gitattributes,把行尾符钉死成 LF
仓库原先没有 .gitattributes,各台机器的 core.autocrlf 各行其是 ——
本地工作副本被转成 CRLF、仓库里存的却可能是 LF,于是本地一改 git diff
就显示成整文件改动、合并时整个文件粘成一个冲突块(实测:某个文件表面冲突
758 行,忽略行尾符后真实差异只有 2 行)。
默认 `* text=auto eol=lf`,再对文本类逐类显式声明;.bat/.cmd 保留 CRLF;
图片、字体、压缩包、音视频、数据库文件一律 binary。
.gitignore 里放行 /.gitattributes —— 它跟 .gitignore 一样是仓级规则,
必须入库,否则别的机器取仓后仍按各自 core.autocrlf 各行其是。
|
2026-10-14 11:23:35 +08:00 |
|
admin
|
d9445b5888
|
oil-ui-pro 0.15.4 → 0.22.2(上游 ui.oiloil.org 正式包)+ 记 P0-98 跨盘 rename 坑
- oil-ui-pro 升到 0.22.2:references 13→28 份(新增 16、删 imagery.md)、assets 增 cards/(22 组)与 fonts/、SKILL.md 顶层五步结构未改名。
- 升级路径:官方 `npx github:oil-oil/oil-cli update` 稳定失败(error=replace、报「检查目录权限」)。
真身为 EXDEV —— 解压在 os.tmpdir()(C 盘)、技能目录在 E 盘,Windows 上 rename 不能跨盘;
CLI 的 catch 把非 CliError 原生异常一律兜底成 replaceFailed,真错误一个字不吐。
做法=借其 prepare() 只做下载+校验,再 cp 到同盘 stage、rename 交换;官方命令复验 up_to_date。
- 回归:product-planning 按名引用的 visual-review.md/tools.md/design-direction.md/style-explorer.md 全部健在;命名闸门 2061|0|27。
- session-mechanism/references/pitfalls.md 新增 P0-98(含通则:更新器把原生错误兜底成指错方向的人话)。
|
2026-10-14 10:21:46 +08:00 |
|
admin
|
053a6a6723
|
session-mechanism:主会话只能由用户开(撤掉"排期建主会话"那条路)
用户报障:「技能中没有任何创建主会话的机制,除非是创建接续会话」。
病灶:supervise-persistence.md §〇 早期把「定时任务创建主会话」与「用户手动
创建主会话」并列成两种合法场景,SKILL.md §⑥ 顺着抄了一遍 ⇒ 读到的人会理解成
"这条路是允许的",于是照做。
实测事故(mcn-aigc-ontology 2026-10-14 07:31):init_workspace 装机制后建出
recurring 排期 [主]-super-i卡片采集-主会话(FREQ=DAILY;BYHOUR=09),prompt 里
写着「你是本工作区的主会话……要推进就直接建 [执行] 排期拉起任务会话」——
主会话的口径被套到了一条排期身上。排期开出来的会话恒是任务会话那一档
(is_background_automation=1)⇒ 台账里多一条"主会话",用户那边没多窗口。
改动:
- SKILL.md §⑥:改成「形态只有一种:主会话由用户手动开」,⛔ 排期拉不出主会话
- supervise-persistence.md §〇:表格两列改一列 + 新增事故回放小节
- supervise-persistence.md §八:删掉「B · 定时任务创建主会话」整行
- architecture.md §1:新增《主会话怎么来:只能由用户手动开》段
- session-rules-check.py:新增判据 ⑬ main_sched(扫排期名以 [主] 开头或含
"主会话" ⇒ ACTIVE 报 fail、非 ACTIVE 报 warn);扫描面 recurring 与 once 全含
- SKILL.md 体检清单:十二项 → 十三项,补 ⑬ 变异对照记录
判据验收(非恒绿):喂 mcn 区真数据三种输入 —— 原样 PAUSED ⇒ warn;
伪造成 ACTIVE ⇒ fail;无此类排期的区 ⇒ ok。
同批带上的既有改动:supervise-launch.py 路径相对化 + 三级取值(禁回落 ~)。
|
2026-10-14 09:48:01 +08:00 |
|
admin
|
aa89ee0333
|
product-planning:补「宿主」这一环(③段加规范 + ①段第4问 + ②段页面关系)
起因:某项目把「往宿主已有页加一块」做成了「另起一页」,宿主原有板块功能整块丢掉。
根子在链上游 —— ①段不问「长在哪」→ ②段不写宿主 → ③段没规范。
本机改 4 文件 / 8 处(附件那份报告只列了 7 处,漏了②段同一句定义的复述点):
- ③段 references/execution-runbook.md:新增 §3.2b「宿主已有页面」——
锁外壳(⛔ 不自造;判据=出现供给中不存在的导航类名即视为未复刻)→ 宿主原有功能逐项回归 →
写进 DESIGN.md 的「必要内容/页面职责」。外壳基线按本机供给实况写:有快照用快照,
没有就用 design-capture 补采,都拿不到则记偏离单 + 3d 证据缺口。
- ①段 references/stage-discovery/references/grill-me.md:交付形态支补第 4 问「它长在哪」
(分支表/三问表→四问表/反面清单/输出检查清单 4 处同步)。
- ②段 create-prd.md 与 stage-requirements/SKILL.md:页面关系字段补「新功能挂在宿主哪一页」,
取值补「宿主页 + 新增块」;create-prd 操作细节补第 3 条。两处字段行逐字一致(⛔ 不复述成两个版本)。
⛔ 未采用附件第 3.1 条的改法(把③段能力边界改成"自带资产已含 9 页整页快照与 345 族"):
本机 design-system-tiaoyue 只有 tokens/brand/components.md/library.json/design-system.html(1.6 MB,
277 族、9 页提取结果),没有 component-library/、没有 snapshot/*.html、没有 tiaoyue-all.css,
app-sidebar 仅作族名出现 2 次、w-16 与 rounded-[100px] 命中 0 ⇒ 本机那句「几何与版式不在包内」
与事实相符,照搬会写出新的不实陈述。两台机器各留一份、不强行对齐(用户 2026-10-13 选 C)。
验证:命名闸门 2061|0|27;③段闸门自身对照 5/5 回归通过;
旧形态残留扫描 0(『至少要问清三件事』『页面关系|有哪几页、门开在哪|』『两条操作细节补充』均已归零)。
|
2026-10-13 22:08:57 +08:00 |
|
admin
|
799ceb749b
|
product-planning ③段:闸门脚本下沉进技能包(框架一份、常量现读)
起因:③段只定义 Gate(自检表),不供给执行件 ⇒ 每个目标自建一份
(实测本区 执行会话/*/ui/_tools/ 下 check_skeleton.py 6 份 / 3 个版本,其中一版
还停在"八页骨架"常量上 ⇒ ②段收成七页后要么 SystemExit、要么静默比错)。
新增 references/stage-delivery/scripts/(跨项目共用一份):
- _common.py 定位(按 docs/pm/*/prd|ui 形态找,⛔ 不写死项目名/文件名)+
自检文本解析规则(唯一一份)+ node/harness 自动发现
- check_skeleton.py ②段骨架 ↔ 原型 FROZEN 表逐页逐位比对;节号/页集合/页数现读
- check_js.py <script> 段 node --check + 模板内 HTML 注释不得含反引号;
查不到覆盖面时给 SKIP 并写明(⛔ 不给假 PASS)
- grab_selftest.py 取自检文本(容忍 IPC 5s 超时;复用同一标签)
- run_viewports.py 逐视口抽密度/横向溢出/外壳高度链;--min-rows 默认 6
- mutate_test.py 变异对照框架(规则文件 mutate-rules.json 留在项目侧)
- selftest_gates.py 闸门自身的变异对照(临时副本上造病,要求报红+一档不该报红)
文档:runbook 新增 §5.6(用法只写这一处);SKILL.md 只留指针。
验证(contentm_agent 实测):骨架 PASS 7 页 39 板块;语法 PASS(1720 行);
闸门自身对照 5/5(改名报红并点名 / 注释带反引号报红 / 原型少一块报数量不等 /
节号加后缀仍 PASS ⇒ 既非恒绿也非恒红);命名闸门 2061|0|27。
浏览器类三条(grab/run_viewports/mutate)因 9223 没在跑,只验到参数链与
"没跑就报没跑"(rc=2),未实跑。
|
2026-10-13 17:47:59 +08:00 |
|
admin
|
510ba9192c
|
session-mechanism:修目标检查线静默死(P0-97)
病根:闸③ 的静默基准只按 cwds 的两种斜杠形态做 like,而会话自建的排期落库是
转义形态(["E://ProgramData//…"])⇒ 匹配恒假 ⇒ _last_progress_ts() 回 0
⇒ `if not lp: return None` 静默返回 ⇒ 本区目标检查线 21 小时零日志零告警
(03:00–22:59 每小时 359/360 行日志是"读任务图失败",闸门日志 0 行)。
修:
- 新增 _cwds_hit():JSON 解码 + 路径归一的唯一判定(闸④ 与闸③ 共用)
- _last_progress_ts() 两路取最大:排期表 + 会话侧痕迹文件;两路全空留限流日志
- 闸③ 静默 return 前补留痕;闸④ 逐条 log 改限流汇总(一夜 2.7 万行刷屏)
- 派活单 cwds 改正斜杠形态(⛔ 不再制造转义行)
- 检查棒尾节:收口动作必须自己落笔,⛔ 不许派给执行棒(且不越权写「已完成」)
- pitfalls 新增 P0-97;selftest 闸④ 判据随变量名放宽(⛔ 不绑死写法)
验证:自检 PASS 110 / FAIL 0;变异对照三档(打死→None+留痕 / 还原→建排期 / 两路全空→三行留痕)
|
2026-10-12 23:42:16 +08:00 |
|
admin
|
20eacef289
|
session-mechanism:自我供给去掉"先删后建",改用 Register -Force 覆盖
缺陷(代码):`collabd.py::_escalate_to_keeper()` 建保活计划任务前先做
`if(Get-ScheduledTask …){ Unregister-ScheduledTask … }`,再 Register。
删与建之间没有原子性 —— 若 Register 失败(最典型=账户非管理员 ⇒ 拒绝访问),
旧任务已经被删掉 ⇒ 净结果从"装不上"恶化成"任务凭空消失"。
实测形态:普通权限建成的任务在一次 `--ensure` 之后从系统里消失,同刻日志报「登记失败:拒绝访问」。
改法:删掉那段前置删除,直接 `Register … -Force`(`-Force` 本身就覆盖同名任务)。
与 `collabctl.py::ensure_keepalive_tasks()` 对齐 —— 那边一直是直接 `-Force`、没有前置删除。
影响面:这是"提权写死"缺陷的放大器 —— 非管理员机上每走一次自我供给就删一次任务;
前一条 `60a6e30`(提权自适应)+ 本条,两处都落地才真正止住"任务会消失"。
仓库卫生:`.gitignore` 加 `**/05-交接单/` —— 机制运行时写的域锁目录(handoff-guard 的 `.locks`)
是运行产物、不入库。用 `**/` 兜两种落点(脚本在 `<技能包>/scripts/` 时 ROOT 算成 `<技能包>`)。
与文档库仓的同名目录不冲突:那边的 `05-交接单/` 是锁根、要入库,本规则只在技能仓生效。
验证(本机实跑)
· 抓自我供给生成的脚本做对照:`Unregister-ScheduledTask` 由 1 处 → 0 处;
`Register-ScheduledTask … -Force` 仍 6 处;diff 显示唯一差异就是删掉的那段。
· `git check-ignore` 两种落点(`<包>/05-交接单/`、`<包>/scripts/05-交接单/`)都命中新规则。
· `selftest.py` PASS 110 / FAIL 0;`install.py --manifest` 77 份文件、语法失败 0。
|
2026-10-12 11:55:02 +08:00 |
|
admin
|
60a6e30ba2
|
session-mechanism:建任务的 RunLevel 改成按账户权限自适应(非管理员机不再被拒)
现象:常驻每次尝试给自己装保活任务,日志都留一行「常驻自我供给(计划任务):⛔ 登记失败:
Register-ScheduledTask : 拒绝访问」⇒ 非管理员账户的机器上常驻没有自愈载体(死了没人拉)。
真因(2026-10-12 实测坐实):建任务时把运行权限写死成 `-RunLevel Highest`,而该机账户不是
管理员,Windows 直接拒绝注册;同一个任务去掉这个参数就建得成。
改法(一次性判定,⛔ 不用「先按 Highest 建、失败再重试」—— 那会让每次多一次失败注册):
新增 `_admin_principal_flag()`:管理员(进程已提权)⇒ ` -RunLevel Highest`(原行为不变);
非管理员 ⇒ 空串(整段去掉 `-RunLevel`);判不出来 ⇒ 按普通权限走(宁可少一次提权,也要建得成)。
落点三处:`collabctl.py::ensure_keepalive_tasks()` 两处(保活任务 + 看板任务)、
`collabd.py::_escalate_to_keeper()` 一处(自我供给旁路)。
同批退役(定案 A):`scripts/keepalive.py` → `keepalive.py.retired-20261012`。
它零 importer、不在 `deploy_code.py` 分发清单,`references/deploy.md §4` 早已写明它是
「旧副本、职责已被本 skill 吸收」;留着就是第二份建任务实现,与「建任务只许一处」相抵。
⚠️ 它的 `-ExecutionTimeLimit (New-TimeSpan -Minutes 2)` 确实与另三处(无时限)不一致,
退役后该不一致一并消失;工作区侧无同名副本,无需清理。
文档订正(旧结论是误归因):
· `assets/board-launch.py.tpl` 那条「`Highest` 不是可选项:`Limited` 实测 `LastTaskResult=1`」
⇒ 订正为「`RunLevel` 按账户权限定」。看板 `LastResult=1` 的真因是单例守卫 + `pythonw`
无 stdout 把退出码顶成 1(`references/pitfalls.md` 已写明),与 `RunLevel` 无关;
非管理员机上 `Limited` 实测建得成、也跑得起来。
· `SKILL.md`、`references/supervise-persistence.md` 同步改口径。
· `references/deploy.md` 包内脚本清单去掉 `keepalive.py`。
验证(本机实跑,⛔ 不真建任务:把脚本调用拦下来只看文本)
· 两分支对照:管理员分支 6/6 段带 `-RunLevel Highest`;强制非管理员分支 6/6 段无 `RunLevel`。
· 与改动前逐字对照:管理员分支生成的脚本归一化后完全一致(6/6 段)⇒ 原行为不变。
· `selftest.py`:改前 110/0、改后 110/0(无回归)。
· `install.py --manifest`:77 份文件、语法失败 0。
· 副本已分发到本机 4 个工作区(md5 与源一致)。
⚠️ 非管理员分支本机验不到(本机是 Administrator)⇒ 该档验收需在非管理员账户的机器上跑。
|
2026-10-12 11:07:02 +08:00 |
|
admin
|
c9e8f0fbb0
|
session-mechanism:init_workspace 两处本机适配回补(副本场景起不来)
背景:这两处 2026-10-09 已在某台机器的工作副本上验证通过,但没随仓发布;
2026-10-12 那台机器按「以仓库为准」覆盖本地后,修复丢失。现按仓规补回仓库版。
一、副本场景 SK 回落技能源
原:SK = Path(__file__).resolve().parent ⇒ 副本(<工作区>/.workbuddy/collab/)下
没有 hooks/ ⇒ ⑤ 自检加载 hooks/_env.py 直接 FileNotFoundError,整段自检作废。
现:加 _resolve_skill_dir(),先判 <sk>/hooks/_env.py 在不在;不在就依次到
CODEBUDDY_CONFIG_DIR 与 ~/.workbuddy 下的 skills/session-mechanism/scripts 找,
取第一个命中;两处都没有 ⇒ 原样返回,让报错照常暴露(不静默跳过)。
只拼相对片段,不写盘符字面量(与「脚本是脚本、配置是配置」相容)。
二、collabd --where 归属判据认反斜杠
原:_ws_ok = ("COLLABD_CONFIG" in 输出) or (ws_s in 输出) ⇒ 恒为 False:
① 输出里没有 COLLABD_CONFIG 字样(它写「配置来源」);
② 输出全反斜杠,而 ws_s 是正斜杠形态。
结果这条自检永远打印 ⛔(即便工作区其实认得)。
现:改「两端都认」—— 正斜杠原样 / 反斜杠形态 / 反斜杠形态经 normcase 归一后
出现在同样归一的输出里,任一命中即通过。
验证(本机实跑,改动前后各一次)
· 副本场景 e2e:改前 ⑤ 打印「⚠️ 自检跑不了:FileNotFoundError」;
改后 ⑤ 全量跑通,`collabd --where` 认这个工作区 = ✅(rc=0)。
· 对照脚本:改前 SK=副本目录、hooks/_env.py 不存在、加载 FileNotFoundError;
改后 SK=技能源、加载 OK。判据 旧=False / 新=True。
· scripts/selftest.py:改前 110/0、改后 110/0(无回归)。
· install.py --manifest:77 份文件,语法失败 0。
|
2026-10-12 10:26:05 +08:00 |
|
admin
|
051482168f
|
video-capture:入仓(加入 .gitignore 白名单)—— 取视频 + 抽帧的全局技能
- 用户 2026-10-12 令「可以加入」。
- 依据:product-planning 第③段的交接说明已把它当**依赖**指向 ⇒ 仓里有引用、仓里就该有实体,
⛔ 否则从本仓还原到别的机器会拿到一个「指向装不出来的技能」的悬空引用。
- 收录 5 个:SKILL.md、scripts/extract_frames.py、scripts/fetch_video.py、
references/视频抽帧与字幕规范.md、ATTRIBUTION.md。
- 目录内 env/ 与 logs/ 仍按本机配置规则挡在仓外(各机器自建)。
|
2026-10-12 09:56:59 +08:00 |
|
admin
|
2666a611b1
|
product-planning:video-capture(取视频+抽帧)已独立为全局技能,③段只留交接说明
- assets/video-capture/SKILL.md 改为**不带 frontmatter 的交接说明**,指向全局技能
E:/ProgramData/.workbuddy/skills/video-capture/(本仓白名单外,故脚本真身不在本仓)。
- 两个脚本 extract_frames.py / fetch_video.py **只搬不删**,移入
references/_留痕/video-capture-已独立-20261011/scripts/ 留档。
- 依据:2026-10-11 用户令「把如何获取视频、如何提取关键帧等视频解析相关内容
打包成一个技能,独立出来,装到全局技能仓」。
- 目的:避免同一套抽帧判据在两处各存一份(改一处漏一处的同族坑)。
|
2026-10-12 09:50:17 +08:00 |
|
admin
|
24040ee171
|
session-mechanism:闸④ 不再被周期排期卡死 + --report 漏 id 当场拒收
① 闸④ 收窄 recurring(用户选 A 案)
改 ws_pending_schedules():schedule_type='recurring' 的行一律不算「待执行」,
once 的过期排除与拦截照旧。
症状=周期排期永远有下一次 ⇒ 拿「在册 + 没跑过」判它恒真 ⇒ 闸④ 恒拦
⇒ 目标检查会话一条都建不出来(aigc-idea-impression 被「AI变现日报 每日 06:00」
挡了一整天,日志每 20 秒重复「还有 1 条待执行排期 ⇒ 不建」)。
变异对照:同一工作区、同一时刻,旧版返回 ['AI变现日报 · 每日自动生成']、新版返回 []。
② --report 拒收闸(用户选 B 案)
--report 后面必须跟真的需求 id;id 为空或以 -- 开头 ⇒ 打用法行 + 退出码 2,台账一字不写。
症状=漏 id 时 _arg("--report") 取到的是下一个 token(--state)
⇒ 台账多一条键名写坏的记录,还被算进队列计数(本区 queue_n 2→3;vibe-product 也有一条)。
变异对照:把闸删掉 ⇒ 同一条命令 rc=0 且真写出 "--state";加回去 ⇒ rc=2 且台账为空。
自检:闸④ 用例 5 → 6 项;新增「拒收闸」用例 6 项(含正例对照,防「未找到部署配置 ⇒ 拒跑」
把 rc=2 混成假绿);全量 PASS 110 / FAIL 0。
文档:references/pitfalls.md —— P0-65 补 recurring 口径(含实测症状与反例库);
新增 P0-96(漏写 --report id 的静默污染 + 判据自身两处假绿坑)。
|
2026-10-12 09:50:10 +08:00 |
|
admin
|
e12e985808
|
移除已不存在的仓库地址引用(P0-75 那条只留教训,去掉仓地址)
|
2026-10-12 08:20:36 +08:00 |
|
admin
|
cd5fcf1d30
|
session-mechanism:修 preferred_model 取数判据——改用人开一次性会话判断会取错(P0-80 二次),现复用 _scan_mains 的主会话候选判据(本区+非worker+非退役角色+按最近活动)
|
2026-10-12 02:35:06 +08:00 |
|
admin
|
d81f75f173
|
技能包:配置与代码分家 —— 每包自建 env/ 放本机专属配置,scripts/ 不再写死本机路径
用户 2026-10-11 原话:
· 19:22「这个环境都是针对一台机器的,同步到别的机器把环境都搞坏了」
· 19:28「不用挪出 用env文件夹区分就行,重点是 脚本是脚本 配置是配置」
· 19:29「每个技能 需要环境配置的 都有自己的 env文件夹」
· 19:30「修改完成后要仔细检查 避免调整后 各技能脚本运行失败」
改动:
1、session-mechanism 新增 env/(roots.env=本机真身不入库 + roots.env.example=样例入库),
install.py 的 ROOTS_ENV 改指 env/roots.env;全包脚本/hook 的配置定位统一为
「向上 4 层 × env/roots.env 优先 → 包根 roots.env 兼容 → 技能库那份兜底」。
2、去硬编码:collabctl / keepalive / supervise-launch / board-launch 里的本机路径与本机工作区
清单全清,改为 DSH_AIROOT(兜底 dirname(DSH_WS_ROOT))+ 扫 <AIROOT>/*/.workbuddy/collab/
自动发现;保活任务名按 collabd-keepalive-<工作区名> 现推;启动器默认值改 ~/.workbuddy 形态。
3、browser-harness:bh_chrome_keepalive.py 默认值全部改 env 驱动,新增 env/bh.env.example。
4、.gitignore:env/ 下只放行 *.example(三行三种层级)+ 兜住旧位置的包根 roots.env。
5、改包纪律.md 新增「四、包结构:脚本是脚本,配置是配置」,立为全仓通用规矩。
6、文档同步:SKILL.md / deploy.md(新增 §3b 配置层级、§6 换机器必查 6 件事)/ rules.md /
pitfalls.md / supervise-persistence.md。
验收(本机):py_compile 34 个 py 全过;selftest PASS 109 / FAIL 0;
逐文件实证 8 个 loader 命中 env/roots.env;preflight-lock.sh 同目录实测解出两个根;
install.py --manifest 77 份、语法失败 0。
异机验证(包拷成「新克隆」(只有 *.example)+ 另造假工作区 ws-alpha/ws-beta):
install.py --apply 自生成该机 env/roots.env;collabctl/keepalive 自动发现的确实是
ws-alpha/ws-beta、任务名现推(写死清单确已消除);部署副本本地无 roots.env 时靠
CODEBUDDY_CONFIG_DIR 兜底读到技能库那份;整套 selftest 有宿主库时 PASS 108 / FAIL 1
(唯一 FAIL=该区没有常驻心跳,环境所致;本机常驻在跑时同一套为 PASS 109 / FAIL 0)。
|
2026-10-11 21:49:28 +08:00 |
|
admin
|
90cc4315d5
|
product-planning:新增「文档的两态:当前版与过期版」——方案文件夹放当前权威版、归档-过期版收过期文档,含收口四步与实测依据
|
2026-10-11 20:27:09 +08:00 |
|
admin
|
fd9c902bcc
|
chore(技能): 浏览器起法收敛为「会话后台任务」+ 关窗即停手;补索引与自测清理
- browser-harness/SKILL.md:§1 起法整段重写为「只允许这一种 —— 本会话的后台任务」(字面命令/
为什么只许这一种/守卫语义/已知代价/起不来对照表);§3 补一条排障 —— 认进程命令行与它自己的日志,
⛔ 别信 pid 父链;**「删掉脚本」≠「停掉进程」**(依据 2026-10-10 实测:孤儿守卫在脚本已删后仍把浏览器拉回)
- browser-harness/agent-workspace/bh_chrome_keepalive.py:守卫语义分两档 —— Chrome 正常关窗(rc=0) ⇒ 停手退出;
异常退出(rc≠0) ⇒ 重拉(依据:用户手关被无条件拉回,连关三次弹三次)
- session-mechanism/scripts/selftest.py:删掉重复定义的 `t_check_cooldown_no_pileup`(两段逐字相同);自测 PASS 109 / FAIL 0
- session-mechanism/references/humanizer-en/SKILL.md:与顶层 `humanizer` 技能同名冲突 ⇒ 去掉本包这份的注册
(`user-invocable: false` + `disable-model-invocation: true`),6 个文件正文一字未动
- session-mechanism/references/01-文档索引.md:补登 `04-决策方法论.md`/`dsh-decision-method/`/`作业规矩/`/`humanizer-en/`
|
2026-10-10 23:25:36 +08:00 |
|
admin
|
a04b2c08e8
|
stage-delivery 硬约束新增:交互改动只做被点名的那几处(2026-10-10 用户令「没让改的 交互不允许乱改」);依据=侧栏宽度被顺手从184收到128、而基准w-16=64px
|
2026-10-10 22:32:39 +08:00 |
|
admin
|
fe37c94096
|
browser-harness:把「Windows 起浏览器」的可抄三步写进正文,启动器随包
其他会话反馈(用户转述):「技能里写了,但说得不完整——这就是我反复踩坑的原因。
正文只写了『起实例 = 丢进常驻后台任务』,没给能直接抄的命令,也没说 Windows 上该用哪个启动器;
真正能跑的入口在技能外的另一个文件里;我照正文起,没做永不退出的循环 ⇒ 任务一结束 Chrome 被连坐。」
真因(读到代码才看清,两节自相矛盾):
- §1 说「要丢进常驻后台任务、且一直不退出」,§2 却直接给了一条 **同步** 的 `chrome.exe` 命令。
照 §2 抄 ⇒ 父进程一退 Chrome 立刻死(实测 `WinError 10061`)。
- 起法真正落在**工作区根**的 `bh_chrome_keepalive.py`(`while True` 守端口那段),而那支脚本**不在技能包里**。
改动
- 新增 `agent-workspace/bh_chrome_keepalive.py`(随包的可复制启动器,行为沿用已实测那支):
幂等(端口已在听 ⇒ 立刻退出)· `while True` 守子进程、退出就重起 · 僵死态**只记日志不自动重启**(保住现场)·
起 Chrome 前清代理 env · `DETACHED|NO_WINDOW|NEW_PROCESS_GROUP` ·
参数化 `--port/--chrome/--profile/--log/--proxy`(默认值与线上一致;`--proxy` 对应文档里那条 socks5)。
- `SKILL.md` §1 改写成**可直接抄的三步**:复制启动器 → `pythonw.exe` 起 → 计划任务兜(动作也用 pythonw、
5 分钟一次、MultipleInstances=IgnoreNew;`schtasks.exe` 在本机黑名单 ⇒ 走 PowerShell ScheduledTasks);
另给校验两条(netstat / curl --noproxy)。
- `SKILL.md` §2 加前置说明:那条 `chrome.exe` 是**启动器脚本内部的那一步**,用途是看懂与排障;
并补 `--proxy` 的用法。
- 顶部那颗「起实例」子弹由「细节见 §1,本处不复述」改成「三步见 §1」——**从"叮嘱"改成"给命令"**。
- 表述按 2026-10-09 的「一律用肯定表述」写:先写要什么(永不退出的循环 / 保住现场),
把踩过的坑放括号里当依据;僵死态那两条由「别把 A 当成 B」改成正向判据「两条都过才叫可用」。
验证
- `--help` 正常;`--chrome Z:/不存在` ⇒ rc=2 且不起浏览器(守卫)。
- 真机幂等:9223 正在听 ⇒ 跑它 rc=0、日志 `port 9223 already listening ⇒ exit (idempotent)`、端口数不变(没新起浏览器)。
- ⚠️ 已知不一致(本次不改,见次日报告):contentm_agent 工作区根的部署副本与 `tmp/bh_keep_chrome.py`
仍是旧的非参数化版本;本次只把**源**落进技能包。
|
2026-10-10 16:26:18 +08:00 |
|
admin
|
5004909267
|
提问规则审计 + 撤出本机生成的两份契约 + 「一律用肯定表述」落进注入面
用户 10-09 三条令:
①「那两份 不说具体 我怎么知道,看看会话提问的规则是否有缺陷」
②「A 方案」(撤出 session-mechanism/roots.env 与 references/manifest.md)
③「要用确定XXXX 这样的描述,避免 不要XXXXX 会导致上下文干扰的描述,除了经验沉淀和红线避坑外」
+「不只是修改 创建生成时也需要遵守」
一、提问规则审计(三条缺陷,全部修掉)
1、判据用错了维度:旧措辞「⛔ 提问正文不许出现的:包名·环境变量·文件路径·commit/sha·表名/字段名·
类名/函数名」是按**词性**一刀切,而同一段末尾又写「正文只留能决定下一步的内容」⇒ 两句自相矛盾。
我按前半句执行、把要撤的文件名删成了「那两份」⇒ 待拍板项不可答。
✅ 改成按功能判:**少了这个标识,用户还能不能决定** —— 不能 ⇒ 写进正文;能 ⇒ 删、下沉技术附录。
2、同一判据散在 6 处、措辞各不同(违反本项目自己的「禁重复判定标准」):已收敛到同一句判据,
并互相标注「改这里必须同批改」。
3、🔴 最隐蔽:**每轮注入的那份 ≠ 包内那份**。钩子 `_core()` 是三级回退,① **本工作区
CODEBUDDY.md 的 `REPLY-CORE` 段**才是每轮注入的(包内那份只是换机器的兜底)。
我先只改包内 ⇒ 注入的仍是旧条文,而"文件都改了、自测全绿",看不出来。
⇒ 两份都改 + 新增防漂移自测 `t_reply_core_same_source`(两份实质内容必须逐字一致)。
二、撤出两份「本机生成」的契约(用户选 A)
- `git rm --cached session-mechanism/roots.env` 与 `session-mechanism/references/manifest.md`
—— **本地文件一律保留**(实测 624 B / 18 568 B 仍在)。
- 为什么必须撤:别的电脑取仓时「同名覆盖」会把它们换成**我们这台机器**的路径 ⇒ 那台机器的
机制脚本去找不存在的目录。
- 新增入库样例 `session-mechanism/roots.env.example`(占位符,无本机路径)。
- `.gitignore`:加这两份的忽略行(⛔ 防 `git add -A` 捎回),并改掉原「刻意入库」那段注释。
三、「一律用肯定表述」写进注入面(原来只在 rules.md,注入面看不到)
- 口径:**写或改技能与规则文件时一律写"要什么、怎么做";新建、生成时同样适用**;
例外=**以「经验沉淀」或「红线/避坑」为目的**的技能与规则(写法=正向目标 + 括号里的踩坑依据)。
- 落点:injected `REPLY-CORE` 段(工作区 + 包内,逐字一致)· `rules.md §9` ·
`改包纪律.md` 新增第 5 条硬纪律(「二、四条」→「五条」)· `01-文档索引.md` 指针同步 ·
把我在注入块里加的那段负向表述改成**正向主导**。
四、🔴 顺带抓到并修掉一个我自己造成的净变差
- 注入块有 **1400 字上限、且从开头截** ⇒ 我加条文把它顶过上限(1274 → 1414+)⇒
尾部三条(变相征询禁止 / 不用征询句收尾 / 本工作区另有定稿)**静默消失**、不再注入。
- 修:上限 1400 → **2000**;并在 `t_reply_core_same_source` 里加断言 **块长 ≤ 上限** ——
以后谁再顶破上限,自测直接报红,逼他"要么精简、要么显式抬上限"。
- 验证:`被截断=False`,尾部三条都回来了。
五、验证
- 全套自测 **PASS 109 / FAIL 0**;py 语法全绿;`install.py --manifest` 重算(78 份,语法失败 0)。
- 注入块实测:来源=工作区 CODEBUDDY.md,不截断,含「一律用肯定表述」「决定对象要点名到具体」
「新建、生成时同样适用」。
|
2026-10-09 10:45:00 +08:00 |
|
admin
|
0204001a1b
|
按用户令收回仓范围:撤出 10-08 混入的 9 个技能目录,改用白名单忽略
用户原话:「同步仓库不是 应该遵循忽略的规则吗,谁让把所有技能都提交仓库的」+「A 肯定要收回」。
- 从索引撤出 9 个目录(**本地文件一律保留**:工作区文件数 5711 未变,一个都没删):
AI HOT、draw-ui、dsh-diagnose、dsh-knowledge、dsh-local-env、dsh-opensource-release、
dsh-workflow、oil-motion、skills-security-check —— 即 2026-10-08 `e03465c` 一次并入的那批
(那条提交自称"按用户令",来源不是本线)。
- .gitignore 改**白名单**:根下 /* 一律挡掉,再逐个放行 6 个技能 + .gitignore + 改包纪律.md。
为什么必须这么改(10-08 混入的真因):黑名单只列"已知不要的",**新冒出来的技能目录**
会被任何一次 `git add -A` 顺手捎进仓库;白名单从机制上堵住这条路。
- 保留 oil-ui-pro:它是 product-planning 第③段的**功能依赖**,撤掉两边都会留悬空引用。
- 现状:仓库只跟踪 6 个技能目录(browser-harness / humanizer / humanizer-zh / oil-ui-pro /
product-planning / session-mechanism)。
- ⚠️ 已知代价(本轮不处理):撤出的目录仍留在**历史**里 ⇒ 新克隆的体积不会因此变小;
且 session-mechanism 里几处「⇒ 技能 X」的散文指针会指向不在仓的技能(不影响运行)。
|
2026-10-09 09:45:00 +08:00 |
|
admin
|
c76f5be36c
|
session-mechanism:接上「遇阻碍 ⇒ 置阻碍 ⇒ 机制暂停」+ 授权检查会话自解除孤儿锁
用户 10-09 两条令:
①「如果 工作区 项目机制 对应的会话异常 导致未解锁的情况下,可以授权 检查会话自解除孤儿锁」
②「其他类型 阻碍 遇到阻碍修改目标状态 暂停机制 让用户决策,不是有这个规则吗」
起因(contentm_agent 实测):一把域锁的持有者会话被 terminated、锁遗留未释放 ⇒ 目标第 4 步 blocked;
R9 一律禁删锁 ⇒ 检查会话连开 11 棒(约 5 小时)每棒都撞同一面墙、零派活,每 30 分钟一棒。
拆开看是三条腿互相锁死:闸③「队列非空」对一条 blocked 恒真;闸① 2026-10-04 收窄时把
sessions-ended 整条腿摘了出去(置了「阻碍」也照样建);结果检查 prompt 又明写「你没有改目标状态的出口」
⇒ 看得见的没权、有权的(目标检查要队列为空)看不见。
改动
- 新增 scripts/lock/orphan-lock.py:孤儿锁「判定 + 解除」的唯一执行面。
判据查宿主库 sessions.status(只读 SQL):working 一律不动;terminated/error/archived 可解除;
completed 须静默 >=30 分钟;查不到 sid / 库读不到一律不动(fail-closed)。
- collabd.py
· 结果检查 prompt 开「一个」状态出口:--set-life 阻碍 --by "<会话名>" --check-why "<一句现状>"
("为什么"的旗标是 --check-why,不是 --why —— 后者是 --retire 的,写错会被静默忽略);
同时把「写明阻碍」的两个出口钉死:台账 --report ... --state blocked --reason +
NEED-USER.md 里明确喊「需用户介入」。
· 闸① 改两档:queue-empty 原样(非「进行中」不建);sessions-ended「只拦『阻碍』」,
「已完成」仍放行(不把 2026-10-04 修好的病搬回来)。docstring 五道闸 -> 六道闸。
· 两条检查 prompt 都加了孤儿锁判定钩子(判「持有者已退出」才可自解除;判「活着」一律不动)。
- R9 条文加「唯一例外」:工作区 CODEBUDDY.md §3(定义处)、references/rules.md 新增 §10、SKILL.md,
以及技能包与文档库两份 handoff-guard.sh 的「抢域锁失败」提示。
- selftest.py:新增两个用例(孤儿锁 16 项,含「working 不许动」的变异对照;阻碍档 6 项,
含「已完成仍要建」的变异对照),并把写在两处的同一判据收成一处(改一处漏一处的实测教训)。
全套 PASS 108 / FAIL 0。
- references/manifest.md:按「改完包必跑」重算(77 份文件,语法失败 0)。
不在本仓(各自仓内提交):工作区 CODEBUDDY.md、文档库 CODEBUDDY.md 与 07-scripts/handoff-guard.sh。
|
2026-10-09 07:24:14 +08:00 |
|
admin
|
c36a3f4a50
|
browser-harness 第一屏:把「起实例要丢后台任务」提上来(用户点破「每会开浏览器都要错一次」)
用户原话:「后台任务开启 浏览器,这个是不是也要写入规则,每会开浏览器都要错一次」。
核实结论:**规则本来就写了** ——「### 1. 🔴 浏览器要由常驻后台任务开着」写得很细(沙箱连带杀子进程、
同步调用起的会立刻死、做法是常驻任务守端口)。**问题在位置**:它挂在
「## 用 browser-harness 调 AI 工具(ChatGPT 等)的提问方法」下面,标题把适用范围限成了"调 AI 工具"
⇒ 干别的活(如③段闸门取证)按目录根本翻不到 ⇒ 每次重踩。本轮又踩一次:用同步方式起实例,
`netstat` 查不到 9223、`curl` 无响应。
改法(两处):
1、第一屏「本机(用户明令)」段加 🔴🔴 一条 —— 起实例=丢进常驻后台任务,⛔ 别在同步调用里起;
写明症状(`netstat` 查不到 9223 / `curl` 报 `WinError 10061`)与做法,细节指向 §1,⛔ 不复述。
2、顺带修一处**上轮编辑留下的结构错位**:`⇒ 必须起独立实例:BU_CDP_URL=…` 原属
「⛔ 不附着用户日常 Chrome」那条的收尾,上轮被接到了"一类任务一个标签"条下面 ⇒ 已归位。
|
2026-10-09 07:20:03 +08:00 |
|
admin
|
4ae1d0e79e
|
browser-harness:补「僵死态」的识别与处置(用户选 B)
用户令 B:⛔ 不动保活脚本,只把僵死态的识别写进常驻实例那节的排查里。
- 位置:「🔴 浏览器要由常驻后台任务开着」那节末尾(讲的就是那个常驻实例的健康)
- 僵死态定义:**端口不应答、进程还活着**;判据**两条一起看**(netstat 无 LISTENING + tasklist 仍有那个 pid)
- 处置:**只能重启实例**,⛔ 不在原地反复重试连接
- 记明**保活脚本兜不住它**:`bh_keep_chrome.py` 那类只做 socket 探端口,对僵死态既不判也不重启
(实测 2026-10-09 `06:56:11 port not answering (pid alive=True)` → `07:06:49` 进程才退出)
背景:2026-10-09 早上实例被反复开标签堆到僵死,用户手动关掉全部会话;同轮已加严标签纪律(见 `b7ba89d`)。
|
2026-10-09 07:19:15 +08:00 |
|
admin
|
b7ba89dadc
|
browser-harness:标签纪律从「一个页面」加严到「一类任务只开一个并复用」(用户 10-09 令)
用户原话:「一类任务只允许 开一个标签页并复用,禁止反复开标签页」。
起因:2026-10-09 早上实测一次**整机卡死**,用户手动关掉全部会话。
现场读数(保活日志 E:/ProgramData/AIProject/contentm_agent/tmp/_bh_chrome.log):
- `06:56:11 port 9223 not answering (pid alive=True)` —— 端口不应答、进程却还活着(僵死态)
- 直到 `07:06:49 chrome exited ⇒ relaunch` 才退出
- ⚠️ 保活脚本 `bh_keep_chrome.py` 只看端口 ⇒ 这种僵死态它查不出、也救不回
改法(两处,单一可信源):
1、第 30 行那条**升级**为「一类任务只开一个标签页并复用,⛔ 禁止反复开」——
补进卡死实测读数,并给出「一类任务」的定义(同一个原型/同一轮站点调研/同一批数据抓取),
复用清单在原五条基础上加一条「换到同任务的另一个页面 ⇒ 也优先在同一标签里 goto_url()」。
2、第一屏「本机(用户明令)」段**加一条指针**(🔴🔴 两级),只讲严重性并指向上面那条,⛔ 不复述细则。
|
2026-10-09 07:11:22 +08:00 |
|