Commit Graph
117 Commits
Author SHA1 Message Date
admin ce05207aa2 graph: 补齐图模式剩余四件(验收机判/回退边/运行期改图/跨图子图),163 条测试全绿
- F1 accepts 机判:report done 前按 artifact:/evidence: 逐条校验,缺什么报什么,不许绕过
- F2 rework_to 回退边:判不过回到指定上游重做,attempts/reworks/事件齐备,人审驳回同路
- F3 运行期改图:add-node / remove-edge,目录锁+唯一临时名+原子替换+_rev 回读,并发不丢更新
- F4 跨图子图:subgraph.gid 引用同工作区另一张图,deps/when/rework_to 加前缀,父等收敛;缺图/自引用/跨图环/嵌套均硬报错
- 测试:122 → 163,新增 T20-T23;顺带修测试进程被本机批量删除守卫误杀的假红
2026-10-19 23:57:40 +08:00
admin ed861471da feat(skill-load-guard): 两句口令分流——完成复杂目标走 graph、完成目标走 loop 2026-10-19 23:20:48 +08:00
admin d349d4a20b feat(board): 机制标签「图」改为 graph(与 loop 并列英文) 2026-10-19 22:43:03 +08:00
admin d662a38944 feat(board): 卡片标机制标签 loop/图(用户:怎区分那个项目是 loop 机制 那个是图机制) 2026-10-19 22:40:02 +08:00
admin efbe128670 feat(board/graph): 图模式接项目看板(只读·类型标签);fix(hook): 裸「完成目标」也触发技能闸;fix(launcher): pythonw 兜 stdout 2026-10-19 22:35:08 +08:00
admin 12b7dd9b02 docs(session-mechanism): 图模式入口对齐 C 方案(122 条测试/全命令面/起一棒最短路径) 2026-10-19 22:28:26 +08:00
admin 0c62e1b350 feat(session-mechanism/graph): C 方案——条件分支、子图、人审、取消、分池、自动派活、进度 2026-10-19 21:37:51 +08:00
admin 3b5bcc535a feat(session-mechanism/graph): B 方案——租约超时、失败策略与触发规则、动态展开
- 租约与超时:节点 start 记租约时刻,ready 时把租约超时的 running 节点识别出来并按策略处置
  (默认回 pending + attempts+1),卡死的节点不再永远占着并发名额
- 失败策略与下游触发规则:节点级重试(次数/间隔/退避/超限转 blocked);
  依赖触发支持 all_success(默认)/all_done/one_success 三档
- 动态展开(map):支持建图时给列表、也支持运行时从上游产物读 N 项;展开出的子节点同样受
  max_parallel 约束,子节点全部完成父节点才算完成
- 测试 52 → 92 条,实跑 Ran 92 tests OK(68 s),现有用例零回归
- README 补三节:字段怎么写、默认值是什么
- 改动只在 graph/ 目录内;collabd.py/goalctl.py/看板/钩子 diff 为空
2026-10-19 21:11:27 +08:00
admin 42a130e4f2 fix(session-mechanism/graph): 并发写不丢状态,测试不再被批量删除守卫拦
- graphctl.py 并发修复
  · 临时名原来固定成 graph.json.tmp ⇒ 两进程同时写直接撞 PermissionError(桌面实测第 14 条)
  · 新增 _update():读最新状态 → 重放本次变更 → 原子替换 → 回读核对 _rev,
    被覆盖则重读重做(最多 3 次),仍失败就报错退出
  · 修掉更隐蔽的一层:后写的整份覆盖前写会让节点状态静默消失
  · start / report 改为走 _update,业务校验放在 mutate 内
- test_graphctl.py
  · 每例只新建自己的目录、跑完不删,整轮收尾清一次 ⇒ 不再触发沙箱「批量删除」守卫
    (此前 49 条里 20 条报 ERROR,全部是本机策略拦清理,用例本身零失败)
  · 新增 T9_Concurrency 三个用例:并发开工、并发回报、版本号每次写都前进
  · 49 → 52 条,实跑 Ran 52 tests OK(13 s)
- README:补「并发写是怎么保证的」三层说明,测试数与用时更新
2026-10-19 20:09:24 +08:00
admin 4866ad8d37 feat(session-mechanism): 图模式补全自动化测试并接入技能入口
- graph/test_graphctl.py:新增 49 个用例,覆盖建图 / 校验硬错与警告 / 就绪集 /
  状态流转 / 非法操作 / 边界 / 写入范围隔离;实跑 Ran 49 tests OK(27.5s)
- graph/graphctl.py:修测试暴露的问题(+50/-10)
- graph/README.md:补「怎么跑测试」一节(+27 行)
- SKILL.md:目录树与入口指针登记 graph/(新增 4 行文档,机制行为零改动)
- 隔离性核对:collabd.py / goalctl.py / 两个看板 / 全部钩子 diff 为空;
  state.py 闸门读数绿、常驻心跳 7 秒、看板 20100 在听
2026-10-19 08:18:57 +08:00
admin 41752fd1f3 feat(session-mechanism): 新增独立的「图模式」模块(不碰现有机制)
- graph/graphctl.py:建图 / 校验 / 算就绪集 / 节点状态流转,一条命令一个动作
  就绪四条件:依赖全 done、自己 pending、域不与 running 重叠、不超 max_parallel
- graph/README.md:用法与边界,明确与 goal.json / tasks.json / 六道闸完全并列
- 实测跑通(4 节点含依赖与域):init → check(域重叠告警命中)→ ready(A、B)
  → start A → report A done → next_ready(B、C)
- 不带常驻进程、不注册钩子、不改任何现有文件;停用即不调用
2026-10-18 22:28:28 +08:00
admin 1a37314519 fix(session-mechanism): 目标检查空闲阈值 3 → 2 分钟,并清掉四处过时说明
- `CHECK_IDLE_MIN` 由 3 改为 2(2026-10-18 用户令;此前 20 → 10 → 6 → 3)
- 同一文件里 4 处说明文字仍写着「静默 ≥20 分钟」,与参数不符(10-07 改参数时未同步)
  ⇒ 一律改为 2 分钟,含检查会话提示词里给会话看的那句「已静默 ≥N 分钟」
- 闸门数量口径统一:4 处「四道闸」改为「六道闸」(实际列的是六条)
- 已同步到工作区运行副本并重启常驻,md5 双端一致
2026-10-18 21:13:42 +08:00
admin 489da5f854 chore(dual-link-proxy): 脚本补可执行位,SKILL 里的直接调用才成立 2026-10-18 20:18:59 +08:00
admin b2016af916 feat(dual-link-proxy): 一键安装脚本,空机器一条命令装完链路与面板
- 新增 scripts/install-dual-link.sh:装 3x-ui → 建两条 VLESS+WS 入站(绑 127.0.0.1)
  → 80 vhost 完成 ACME → 签证书 → 切 443 → 可选面板子域 + Basic Auth → 实测 101 并打印链接;
  支持 --dry-run 干跑、--yes 无人值守、已有 3x-ui 时复用而不重置密码
- 3xui-api.py 补 uuid / link / del-inbound 三个子命令,add 的 --uuid 改为可选
- verify-links.sh 统计实际检查项,空跑以退出码 2 报错,避免假通过
- 避坑清单补三条脚本类实测:ss 端口判定的字段误用、dry-run 仍落盘、验收空跑
2026-10-18 20:18:33 +08:00
admin cc86680e05 fix(session-mechanism): 看板标「状态未收口」+ 决策判据补两处口径 + 换目标留验收痕迹
- 项目看板:非「已完成」的目标,若一条验收判据都没有、或有判据但一条都没过,
  卡片上标「无验收判据/验收未收口(N 条全未过)」—— 实测 aigc-idea-impression
  的归档件曾在「执行中」列摆了 7 天(2026-10-18 核查)
- 决策判据每轮注入:写明那份技术实现清单是举例不是穷举、「功能语义分叉」的判据
  收窄为「用户日常操作路径有没有变」(2026-10-18 实测滥用后果:把两件技术实现
  做成了待拍板)
- goalctl 换目标归档:顺手判一次旧目标验收有没有收口,没收口写进归档件 `_验收未收口`
  并在 lifecycle_why 留痕(不拦换目标)
2026-10-18 20:17:49 +08:00
admin 879156f75c feat(dual-link-proxy): 加 add-user / del-user,改用 v3 的 clients 接口
3x-ui v3 把客户端改成全局实体、再 attach 到入站,入站的 update 接口不再改客户端列表
(实测返回 success 但没写进去)。改用 /panel/api/clients/add 配
{"client":{...},"inboundIds":[...]},一条命令即可把同一个人挂到多条链路;
销号走 /panel/api/clients/del/{email}。

另修一处:v3 服务端会自行生成 UUID,脚本改为建完回读真实值再打印。
2026-10-18 18:27:50 +08:00
admin acfb252bee feat(skills): 两包资源索引机制与双向对账脚本
- product-planning:新建 references/manifest.md 作资源唯一登记处(资源/落点/引用点/口径);
  顶层 SKILL 加两条硬规矩,design-capture、stage-delivery、execution-runbook、stage-requirements
  四处把散落路径改为「落点见 references/manifest.md」
- session-mechanism:01-文档索引 新增 §四「包内资源索引」,并说明不放 manifest.md 的理由
  (那份由 install.py 本机生成、被 .gitignore 挡着)
- 新增两包共用的 scripts/check_resource_index.py(双向对账)与 product-planning/scripts/check_figures.py(图片机检),
  selftest 补对应用例,06-技能优化规程 写入写法规矩
- .gitignore:新增 _留痕/ 不入库(改造前整包快照,180K/688K,库内从无先例)
2026-10-18 18:07:40 +08:00
admin a9d2adaf72 feat(dual-link-proxy): 新增双链路代理搭建与运维技能(已脱敏)
把「在已跑 nginx 的 VPS 上从零搭起橙云 + 灰云双链路、并用 3x-ui 管多用户」
的全过程沉淀成技能:五阶段工作流、五条硬性前提、三条易踩反的判据、19 条避坑。

- references/01 前置取证与选型:泛解析不等通、端口取证、nginx 约束下的选型
- references/02 服务端落地:3x-ui 与 sing-box 两条路线,含包名与 2096 冲突
- references/03 nginx 与证书:80 → 签证书 → 443 的顺序、AEAD 套件、口令文件位置
- references/04 面板与多用户:3x-ui 三层模型、加人步骤、CSRF 登录法
- references/05 避坑清单:19 条,正向写做法、括号里附踩过的坑
- scripts/verify-links.sh 与 scripts/3xui-api.py:两个脚本均对真实环境跑通

正文已脱敏,域名/端口/口令/UUID/主机 全部改为占位符。
2026-10-18 15:05:52 +08:00
admin 310a964a94 fix(session-mechanism): 常驻读不到宿主库 ⇒ 检查会话永不建
- init_workspace.py 生成配置时写 host_db(宿主 env → 本包 env/roots.env);旧配置留空则补,已写值不动
- collabd._wb_db() 去掉 ~/.workbuddy 回落(本机无此文件),取不到改为占位路径 + 限流留痕
- _sm_load_roots() 先读 COLLABD_CONFIG 所指配置的 host_db,再试 <CODEBUDDY_CONFIG_DIR>/skills/session-mechanism/env/roots.env,最后才上跳
- pitfalls 新增 P0-99(含「新工作区验收跑一次脱环境探针」通则)

实测:deepwrite-harness 新建区 2091 条「读库失败」、11.5 小时零检查会话;修复后五区重启读库失败归零,检查会话建棒并把目标置「已完成」
2026-10-17 11:36:13 +08:00
admin 8160f91559 技能库同步:另一台机的 2026-10-16 包 + element-picker 入包 + 工具归拢到技能级 assets/
product-planning(同步 26 改 65 新)
- 目录约定:docs/pm/<项目>/ ⇒ <工作区>/项目/<产品slug>/ 为产品根,下分 产品规划/ 与 产品原型/{designs,pages}
- ④段骨架六节 ⇒ 七节(新增「原型地址」;后两节改「页面导航」「原型状态取值」)
- ③段新增真机组件库;结案「源站只有暗色主题」,tokens.css(亮色)标为不可用于生产
- ③段改版规则反转为「一个产品只用一套原型、只留当前态」;②段新增 产品规划模板.md(表头唯一定义处)
- scripts:产品根定位重写(含 .registry/current-project 指针),新增 check_terms.py 与 selftest_product_root.py

session-mechanism(同步 3 改 2 新)
- references/06-技能优化规程.md 新增 §5「要求落在生成时看得见的面上」,总表 16 ⇒ 17 条;SKILL.md 同步
- scripts/collabctl.py 取回 _find_board() 候选定位(旧版写死 scripts/board.py,而看板已搬进 boards/会话看板/ ⇒ 旧版本就是坏的)

element-picker(新装)
- 按用户口径作「独立功能加入 product-planning」,非独立全局技能
- 修掉它自身三处路径漂移(技能根写法 ⇒ 同目录;README 两处旧落点;剪贴板示例文案与代码对齐)

工具归拢到技能级 assets/
- diagram-design / design-capture / element-picker / video-capture 从各段 assets/ 移到技能包 assets/
- 新增红线:本包有两处 assets/(技能级工具箱 vs 段内资产),引工具一律写「技能级 assets/<工具名>/」
- 路径口径由两类改三类(技能级工具箱 / 本段自带资产 / 同根技能)

不入库(磁盘保留)
- design-system-tiaoyue 整个目录(用户 2026-10-16 令):git rm -r --cached + .gitignore,理由=14 MB 且可 CDP 重采;
  已在 ③段 SKILL.md 注明「取仓后这一层是空的属正常,用自带套需另取或重采」
- element-picker 的运行期存档 marks/(服务自己会建目录)
2026-10-16 23:13:33 +08:00
admin 749c0e3d5d product-planning:把「图要表达结构或流程」写成配图节的统一判据
- 「产出文档开头必须有图」一节原来只写「图表达这份文档覆盖的东西之间的关系」,各段再各自描述画什么;
  现补一句统一判据:图要**表达结构或流程**(二选一或兼具)—— 一张图看完就知道「由哪几块组成、怎么连起来」
  或「一件事分几步走」;⛔ 不做纯装饰性配图。
- 与原有各段的描述一致(①对象与流向/②页面骨架/③页面结构与操作动线/④页面结构图+用户路径),
  属于收紧表述、不改变要求。
- 验收:check_naming.py --ws E:/ProgramData/AIProject/contentm_agent = 通过 225 / 失败 0 / 提示 27。
2026-10-16 07:26:22 +08:00
admin 7514a5f0fe session-mechanism:05/06 只收通用要求,环境配置专属规则全部移出
用户令(2026-10-16):「技能优化规则 只能放 通用要求,不能放技能环境配置目录要求的专属规则」
+「技能库盘点规则 也要按照这个标准调整」。

- 06 删掉 A 段(配置外置/不写死本机/本机生成契约/路径形态/入仓白名单)与总表的 A 层 5 行,
  总表 21 条 → 16 条三层(B 结构 4 + C 流程 9 + D 表述 3),编号重排 1–16;
  入口写明「只收通用要求」,专有配置规则指向 01-文档索引.md 的「技能环境配置规范」。
- 05 的第三段删掉 白名单/本机生成契约/写死本机/路径形态 四项(同属环境配置规范),
  查隐患段剩三项并重编号;全篇 11 项 → 7 项。
- SKILL.md §0 的 ⑧⑨ 两项摘要同步(条数、编号、A 段删除);05 的编号引用改指重排后的 #4/#1。
- 自测 t_skill06_entries_same_source 的条数口径 21 → 16。

验收:全量自测 PASS 113 / FAIL 0;体检 fail 0 / warn 1 / ok 15;manifest 82 份;
install.py --verify 全绿;05 = 76 行、06 = 106 行。
2026-10-16 07:17:16 +08:00
admin 24a644f57b session-mechanism:多角度自检后的 5 处修补 + 新增「21 条条目名三方同源」自测
按用户令「优化完成后 在详细多角度 检查确认无误」,对 05/06/SKILL.md/索引 做了一轮多角度核对。

查出的真问题(都已修):
- 05 残留旧编号「06 的 B⑨/B⑥」⇒ 06 的编号已统一成 #N,改为 #9/#6
- 06 总表 #15 写「上游→下游不断裂」,而正文与 SKILL.md 都写「上下游不断裂」⇒ 统一
- 05 用了旧称「宿主库」(该文件 10-15 新写,按术语规范应当用正式名)⇒ 改「WorkBuddy 本体的库」
- 06 的 A 段声明「不复述判据」,但 #3 条又把 env/roots.env 的细节抄了一遍 ⇒ 删复述
- SKILL.md §0 ⑨ 的 A 段没编号、C 层写简写(「职责不越界」vs 正文「步骤间职责不越界」)⇒ 补 #1~#5、统一 C 层全名

新增自测 t_skill06_entries_same_source(5 项):SKILL.md §0 ⑨ 与 06 正文/总表 21 条逐条同名(数字 + 名字)。
该判据第一版自己就有两个毛病,靠变异对照照出来:① 抓取正则在「(」处不停 ⇒ 名字带括号内容;② 06 正文 A 段是
列表项、SKILL.md 却没编号 ⇒ 两边都只抓到 16 条。修完口径后三态齐全(基线绿/写简写则红并精确报出 #13/复原绿)。

验收:全量自测 PASS 113 / FAIL 0;体检 fail 0 / warn 1 / ok 15;manifest 82 份;install.py --verify 全绿;
05 = 95 行、06 = 120 行(均在一页纸内)。
2026-10-16 00:00:44 +08:00
admin ea02f186a5 session-mechanism:06 收窄到「描述·结构·流程」,环境配置 A 层改为指针
用户令(2026-10-15):「这些不是技能优化规则把,是属于技能环境配置规范」+
「技能优化是为了让技能相关描述 结构清晰 重点突出,描述简洁 高效 实用 无歧义,
流程顺畅,功能正常,规则边界清晰,无冲突」。

- 06 重定范围:只管 B 结构/C 流程/D 表述三层;A 技能环境配置只留 5 条名字与指针,
  ⛔ 不复述判据(复述=第三处真源 —— 该规范正本早已在 SKILL.md §0 两段 + 禁令 11 + 仓根 .gitignore)。
- 新增「本规程管什么」一节,用用户原话十项目标写成,B/C/D 各层标注对应哪几项。
- C 流程层 9 条从总表提上正文(原先只在表里);编号统一成总表的 1–21(原正文是 A①…D⑫ 两套编号)。
- 优先级重排:B 结构 > C 流程 > D 表述。
- 05 的 ⑤~⑧ 判据指针改指真源(原先指 06 的 A 层,而 06 那层现在也是指针 ⇒ 避免二级跳转)。
- 01-文档索引.md 新增「技能环境配置规范」一行(此前这份规范没有入口名)。

06 由 126 行压到 120 行(上限内);全量自测 PASS 112 / FAIL 0。
2026-10-15 23:52:08 +08:00
admin a46b914a80 session-mechanism:术语表收敛到一处 + 「宿主」改正式名 WorkBuddy 本体
用户令:「宿主 这个词要优化,看看产品规划技能中是如何优化这些难懂的词」。
口径借 product-planning 的语体规范(references/stage-proto-doc/references/doc-language-spec.md
§2.1–§2.4):技术实现名不当正式名;正式名取界面实显名/术语表/行业通用词;一个东西一个名;首次出现给全称。

- architecture.md §7 立为「术语唯一天条真源」:正式名「宿主」→「WorkBuddy 本体」,表加「旧称/别再叫」列,
  并入 collab-detail §11 的独有条目(设备接入·本地反代/覆盖网络节点·中继客户端/棒/会话);新增 §7.1 写词的规矩。
- collab-detail.md §11 的两张表删除、改为指针。实测打架:§11 写「宿主提供五样(含执行体·会话)」,
  而 architecture.md 与 collab-detail §1 都写「四样」⇒ 同一条两处两说。§11.1 命名铁律原文保留。
- SKILL.md:description 的悬空指向「见文首术语表」(本包从没有术语表)改为「见 architecture.md §7 术语」;
  「现状地图」首屏加一行「宿主 = WorkBuddy 本体」。
- 01-文档索引.md 加一行(看不懂的词 → architecture §7);06 的 B⑧ 加术语正本指针。

新增自测 t_term_table_single_source(3 项):全包只许一处 `| 正式名 |` 表头且必须是 architecture.md、
正本里不许再出现「| **宿主** |」。已做变异对照(塞第二张表 ⇒ 报红;复原 ⇒ 绿)。
2026-10-15 23:46:16 +08:00
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