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 三份改动文件全过
This commit is contained in:
admin committed 2026-10-14 16:33:28 +08:00
1 parent 52566c79f9
commit fe22f4cebe
5 files changed
+121 -19

No files matched your search

+14 -3
View File
@@ -68,7 +68,7 @@ agent_created: true
⚠️ 那篇里还有**文档四条规则**(分类索引/结论在最前/历史倒排·新的在前/单条 ≤6 KB)——
**⛔ 只写进工作区日志的规矩 = 没立**(10-04 实证:一条红线立在对的地方,换会话照样读不到)。
## 🔴🔴 第 0 步:加载门槛(2026-10-05 立 · ⛔ 这是**第一条**,在十条禁令之前)
## 🔴🔴 第 0 步:加载门槛(2026-10-05 立 · ⛔ 这是**第一条**,在十一条禁令之前)
> **判据(一句话)**:**用户说了触发句 ⇒ 第 0 步是先加载本技能,然后才动手。⛔ 没有"我大概知道"这条捷径。**
@@ -111,7 +111,7 @@ agent_created: true
- **⛔ 装完不停手**:装机 ≠ 完成目标。装完**继续**把触发句那个目标接下去(起常驻 → 查目标 → 派这一轮任务会话)。
⛔ 不许在装完或 `--verify` 全绿处停下、回头问"要不要继续干"—— 那是把已授权的事重新要签字。
## 🚨 十条禁令(2026-10-05 立 · ⛔ 每条都栽过,栽一次就重来一遍)
## 🚨 十一条禁令(2026-10-05 立 · 2026-10-14 加第 11 条 · ⛔ 每条都栽过,栽一次就重来一遍)
> 用户 2026-10-05 原话:「**你不要给我知道了,你给我记下来,每次都是知道了,知道了,过一会儿又忘了**」。
> ⇒ 所以这些话不放日志、不放事后复盘,**放在每次加载都会读到的地方**。⛔ 改任何东西之前先过一遍。
@@ -126,6 +126,10 @@ agent_created: true
8、⛔ **凡"东西自己反复触发",第一步读它的调度定义**(触发条件/重复间隔),⛔ 别从现象反推。
9、⛔ **验证通过的结论,落点只能是技能**(`SKILL.md` 第一屏 或 `references/`),⛔ 不许只写工作区日志。
10、⛔ **用户说"你知道了"时,⛔ 不许回答"知道了"** —— 去把它写成上面这种条文。
11、⛔ **包内代码不许留盘符字面量**(2026-10-14 用户令:「能用相对路径的都要用相对路径」)——
引用**本包自己的**文件一律从 `__file__` 推导;**推不出来的**(工作区根/配置目录/文档库根)读本包 `env/roots.env`。
⛔ 也不许"推不出来就回落到一个猜的盘符" —— 要**如实报错 + 留痕**(静默扫空与"本机真没有"表现一样,最难查)。
📌 判据见 §0「路径一律用相对」。
## 🗺️ 现状地图(2026-10-05 · ⛔ 看机制**先读这一屏**,读完再往下)
@@ -426,7 +430,14 @@ python .workbuddy/collab/collabd.py --set-life 进行中 --by "主会话"
🔴🔴 **未装即装(2026-10-14 用户令)**:用户说「使用项目机制完成目标:XXXX」而本区没装 ⇒ **先 `--apply --workspace <本区根>` 装好再干活**(判据与停止线见上面「第 0 步的连体动作」)。
🔴 **`--workspace` 要点名本区绝对路径**:`roots.env` 里 `DSH_WS_ROOT` 可能指向别的工作区(实测本机指向 `ai1net-dsh-server`)⇒ ⛔ 不让它顶替,装到别区 = 静默错归属。
🔴 **包内目录怎么分(2026-10-11 用户令:「脚本是脚本 配置是配置」)**:**每台机器各不同**的配置一律放本包 **`env/`**(`env/roots.env` 本机生成、不入库;`env/roots.env.example` 是入库样例);`scripts/` 只留通用代码。仓根 `.gitignore` 只放行 `env/**/*.example`。
🔴🔴 **看板一律进 `boards/<看板名>/`(2026-10-14 用户令:「把这两个看板都纳入会话技能中,分两个看板文件夹」)**:**自带页面的看板程序**(页面 + 脚本 + 启动器)**整包**放本包 `boards/` 下一个看板一个文件夹 ⇒ ⛔ 别把看板的 `.py` 散在 `scripts/`、页面散在 `assets/`(那样一个看板的东西分两处,改的时候必漏)。现有两个:`boards/会话看板/`(会话架构看板 · 端口 20099)/`boards/项目管理界面/`(项目+任务看板 · 端口 20100)。🔑 判据:**装进来的是"一个能跑起来的界面"⇒ 进 `boards/`;是"被别的程序调用的机制代码"⇒ 进 `scripts/`;是"纯样式或模板"⇒ 进 `assets/`**。
🔴🔴 **看板一律进 `boards/<看板名>/`(2026-10-14 用户令:「把这两个看板都纳入会话技能中,分两个看板文件夹」)**:**自带页面的看板程序**(页面 + 脚本 + 启动器)**整包**放本包 `boards/` 下一个看板一个文件夹 ⇒ ⛔ 别把看板的 `.py` 散在 `scripts/`、页面散在 `assets/`(那样一个看板的东西分两处,改的时候必漏)。现有两个:`boards/会话看板/`(会话架构看板 · 端口 20099)/`boards/项目看板/`(项目+任务看板 · 端口 20100)。🔑 判据:**装进来的是"一个能跑起来的界面"⇒ 进 `boards/`;是"被别的程序调用的机制代码"⇒ 进 `scripts/`;是"纯样式或模板"⇒ 进 `assets/`**。
🔴🔴 **路径一律用相对(2026-10-14 用户令:「会话技能中 能用相对路径的都要用相对路径」)**:包内脚本引用**自己的**文件(`scripts/`、`boards/`、`references/`、`assets/`)一律从 `__file__` 上跳推导,⛔ **不写盘符、不写用户目录**。🔑 **判据问一句:「这个根能不能从『我自己的位置』推出来?」**
- **能**(本包自己的目录)⇒ 推导。例:`boards/项目看板/project-board.py` 取包根=`HERE.parent.parent`(上跳两级),⛔ 不写 `"E:/ProgramData/.workbuddy/skills/session-mechanism"`。
- **不能**(工作区根、文档库根、宿主配置目录 —— 技能包跟它们**没有任何相对关系**)⇒ 那是「本机各不同的配置」⇒ **读本包 `env/roots.env`**(`DSH_AIROOT`/`DSH_WS_ROOT`/`CODEBUDDY_CONFIG_DIR`/`DSH_DOCS_ROOT`),⛔ 不在代码里留盘符字面量。
- **推不出来 ⇒ 如实报错 + 留痕**(⛔ 不许静默扫空 —— "扫不到"与"本机真没有"表现完全一样,是最难查的一类假象)。
- ⚠️ **文档/注释里的绝对路径不在此列**(举例、历史取证、报障记录照写 —— 那是证据,改了反而不忠实)。本条只管**会真正被执行的代码**。
- 📌 落点:`boards/项目看板/project-board.py`(`_sm_load_roots()` + 技能根上跳两级 + `WS_ROOTS` 从 `DSH_AIROOT` 推导)、`scripts/selftest.py`(生产区定位改为扫 `DSH_AIROOT` 下兄弟区,⛔ 不写死某个区名)。
**⓪ 我要动手(建判据/写验收/报"已完成"/任何带"现在·已·还差"的结论)** ⇒ **先读 `references/00-动手前必过.md`**(🔴 **动手层**,2026-10-04 建,只有三条动作:① 查状态**问程序自己**,⛔ 不许 glob/手拼路径 ② 引用任何读数**先看它什么时候写的** ③ 写判据**先让基线全绿**再谈抓得住 —— 每条都对应当天真实翻车,且都已落判据不许退化)。