dsh-crwu-workbench 0.0.39 → 0.0.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,177 @@
7
7
  `cordis_define` + `cordis_run` 装配,版本号用 DSH 的 `pkg-N`);它已在本仓收尾时删除
8
8
  (见 `0.0.1` 一节),下面 `legacy · pkg-43` 及更早的记录是它的历史。
9
9
 
10
+ ## package · 0.0.41 · 2026-10-11 · feat · 本地审核(选本机文件、一次性交接给一条新对话)+ 报告审核页重构
11
+
12
+ - 通用准则公共能力逐项执行本次报告披露根内已启用的报告与评估说明校对 CHK,保留检查状态、本项目证据与无法核验原因;内部表单检查只形成内部质控意见,外部正式缺陷仍须独立的已核验依据。
13
+ - 澄清机构制度体系对照的排除边界,保留既有目录递归装配与数据勾稽分工,不新增 Skill、知识库路径键或模板依赖。
14
+ - 增加公共校对范围与输出权限的源仓契约回归。
15
+
16
+ - 报告审核合并为单一「报告列表」,移除 AI审核列表及顶部 Tab,新增独立 AI审核列;查看报告、审核摘要、结果分析、原始交付件与原始报告讨论合并到报告行。JSON 单独存在时也视为审核历史,重新审核需要确认。
17
+ - 首次进入、搜索、翻页和刷新按氚云分页定向补齐 OSS;`oss-index` 新增 `seqNos` 批量应答,Host 实例共享并发 3、90 秒整批截止时间,支持请求取消、逐项失败与单行重试。上传完成只补查当前页对应流水号,不扫描总前缀、不提前读取全部 JSON。
18
+ - 协议升级至 27;Client 在确认 Host 协议兼容后才发送批量请求,翻页及离开模块取消旧轮并丢弃迟到响应。
19
+
20
+ **本地审核与工作台 UI 重构(2026-10-11)**
21
+
22
+ 用户口径:**在「报告审核」页下增加并列页签「本地审核」** —— 选本机文件或文件夹,插件建一次性
23
+ 输入快照并开一条新对话,审核结果只存在于那次对话里。两条流程完全独立;报告审核的既有流程、
24
+ 字段与 HTML 结果一个字不改。
25
+
26
+ - 新增三个 Host 操作(操作清单 39 → 42):`local-audit-status`(按本次选择扫描:递归展开、
27
+ 按真实路径去重、不跟随符号链接、跳过特殊文件、读写性与大小、**超过 30 个明确阻止且不截取**)、
28
+ `local-audit-start`(重新校验选择 → 建临时快照 → 生成一次性 handoff 与**可复制的固定提示词**)、
29
+ `local-audit-claim`(把 handoff 绑到一条会话并回传案例目录)。
30
+ - 新增模型可见 Tool `crwu_audit_local_claim`:完全权限下人工新建对话、粘贴提示词之后,
31
+ 由它把临时案例目录**绑定到那条会话**。身份只来自 `exec.agent.id`;同一条会话重复认领幂等,
32
+ 别的会话拿到"已用过";过期 / 快照不在时明确要求回 Workbench 重新准备,**不退化成本机搜索**。
33
+ - 新增本机访问具名操作 `system.local-audit-material.snapshot`(特权、只给面板):未授权时
34
+ **一个字节都不读**,授权通过后逐次留结构化诊断。快照落在操作系统临时目录
35
+ `crwu-local-audit/<handoffId>/`,含 `材料-源/`、`本地审核清单.json`、`快照元数据.json`;
36
+ 原始文件随后被删除不影响那次对话。
37
+ - 案例门禁增加第四类调用者 `kind: 'local'`:本地审核的案例目录在临时目录下,普通会话判据
38
+ (`<工作空间>/<流水号>`)覆盖不到它,因此走 `local-audit-claim` 写下的会话级 scope,
39
+ 并且模型提交的 `caseDir` 必须与那一份案例目录规范解析后精确相等。
40
+ - 客户端新增「本地审核」页签与 `LocalAuditPane` 一族组件:三块卡片(已选择内容 / 选择文件 /
41
+ 补充提示词)、阶段条、失败卡片与复制提示词兜底、`aria-live` 状态、语义化列表与
42
+ `prefers-reduced-motion` 支持;主按钮九态与设计表逐条对应。选择能力缺一即显示
43
+ 「当前 DeepSeek Harness 版本不支持本机文件选择」,不暴露 JS 错误或底层服务名。
44
+ - 会话由**客户端**用 DSH 的 `sessions.create` / `using`(rename + prompt)建普通对话,
45
+ 再用 `uiWorkspace.openSession` 切过去;Host 只负责扫描、快照、handoff、提示词、claim 与清理。
46
+ 任何一步失败都不丢已选内容与提示词,并给出「切完全权限 → 新建对话 → 粘贴发送」的人工路径。
47
+ - 新增 `crwu-audit/references/16-local-audit.md`:定义一次性交接的认领、氚云相关步骤记
48
+ **不适用**而非缺失、只在案例目录内交付(不调用 OSS 发布与钉钉两件),以及 HTML 必须标记为
49
+ 「本地审核」并用图标 + 文字 + 颜色区分「没有该数据 / 处理失败 / 不适用 / 文件没有被审核」。
50
+ - 草稿归 `apply()` 持有:`createLocalAuditPaneController(services)` 在客户端 `apply()` 里建一份、
51
+ 随 props 下发 —— 状态机若长在页面组件里,切一次页签就会把用户刚选的文件丢掉(与「不要丢弃已选内容」
52
+ 冲突)。页签条用 `role=tablist/tab/tabpanel` + roving tabindex + 左右/Home/End,
53
+ **报告审核那一侧的内容与拦截屏一个字没改**。
54
+ - `install/browser-check.mjs` 新增一段**只读**的「本地审核页签」验收(页签语义 / 三块卡片 / 空态文案 /
55
+ 主按钮禁用 + 旁边的原因文字 / 切回报告审核后本地页卸载而报告正文还在 / 切页签零副作用)。
56
+ - 逐字对齐设计 §2–§9 的用户可见文案:补上页面副标题与辅助说明(「选择本机文件或文件夹,创建一个新的
57
+ 审核对话。」/「文件只会用于本次对话,不会进入报告审核或云端交付流程。」)、把复制成功的反馈改成设计里的
58
+ 三行(切完全权限 → 建新对话 → 粘贴发送,且已选内容与提示词仍然保留),并把「待审核」补进文件状态
59
+ —— 扫描窗口里已经选中的行先画成「待审核」占位行,计数如实说「正在统计文件数量…」而不拿旧数字或
60
+ `0 B` 冒充结论。新增一条**文案契约**测试逐字比对设计里那 40 余句原话与五个状态。
61
+ - 新会话走 `sessions.create({ cwd: 案例目录 })`:不需要预先注册工作空间(host 侧会 `mkdir -p`
62
+ 该目录并把它写成会话 `meta.cwd`,也就是它的沙箱边界),因此这条会话会出现在侧栏**「未分组」**下
63
+ (与协议 24 同源),标题由插件 `rename` 成 `本地审核 · MM-DD HH:mm`。取证见 development-notes。
64
+ - 修掉"页面滚动条没了"(用户实测反馈):两处独立原因 ——
65
+ ① 页签内容块没有把高度接下去,`pane-main` 被撑成内容高(1704/1704)而外层 `overflow:hidden`,
66
+ **整页没有任何滚动**;`tests/unit` 补了结构回归,无头实测从 `canScroll=false` 变 `true`。
67
+ ② 报告审核正文同时写了标准属性 `scrollbar-width/scrollbar-color` 与 `::-webkit-scrollbar`,
68
+ Chromium 里前者会让后者**整段失效**、退回 macOS 的 overlay 条(不滚不画)—— 实测滚动条占位
69
+ 从 10px 变 0。现在只留 `::-webkit-scrollbar` + `scrollbar-gutter: stable`,滚动条始终可见。
70
+ - 修掉页签下方那条横线(用户实测反馈)与重复的大字标题:横线的根因是**双层 Workspace Surface**
71
+ —— 外层纸包着页签,报告审核页自己又带一层框,那圈 1px 描边正落在页签正下方;
72
+ 现在嵌在页签内容块里的 surface 不再画框(`border/radius/shadow` 全撤),并补上
73
+ `.crwu-audit-tab-panel` 把高度接下去(否则内层 `height:100%` 退化成 `auto`、列表滚不起来)。
74
+ 同时按口径移除报告审核页头那行 24px「报告审核」大字(模块身份由页签承担),
75
+ 相关结构判据(等待页、页内身份代理)改用列表数据区。
76
+ - **修掉切页时页签下面那一大片空白**(2026-10-11 用户实测):上一轮把两个 tabpanel 改成常驻
77
+ (非选中者是 `hidden` 空壳)之后,空壳仍然参与布局 —— `.crwu-audit-tab-panel` 上的
78
+ `display: flex` 是**作者样式**,会盖掉 UA 样式表对 `[hidden]` 的 `display: none`。
79
+ 无头实测(900px 视口)空壳占 **320px 高**,报告页只剩 484px。现在补
80
+ `.crwu-audit-tab-panel[hidden] { display: none; }`(实测:空壳 0 高、报告页拿满 804px),
81
+ 并加了样式契约回归 + 真机 browser-check 的正反两向高度断言。
82
+ - **「查看报告」改由客户端打开链接(用户实测"浏览器很慢")**:原来这条路是**两次串行的提权进程**
83
+ —— `ossutil sign` 出链接、`open <url>` 拉起浏览器。第②步现在交给客户端:
84
+ `oss-link` 新增可选入参 `open: false`(只回链接、宿主一个浏览器进程都不起),客户端
85
+ 拿到链接后自己 `window.open` —— 桌面端主进程的 `setWindowOpenHandler` 会把它转成
86
+ `shell.openExternal` → **系统默认浏览器**(本仓 notes §14.1 那张表里早就写明,登录流程正是
87
+ 为了避开它才改用内置浏览器)。兼容性:旧宿主忽略这个参数、照旧自己打开并回 `opened: true`,
88
+ 客户端看到 `opened === true` 就不再开第二个窗口。协议 30 → 31。
89
+ 另外该行在打开期间显示「正在打开…」(占主位、不可重复点)。
90
+ 实测:交付件 HTML 只有 200–450KB、`ossutil sign` 本机 29ms,所以"先 `ossutil cp` 到本地再打开"
91
+ **不会更快**(同一份数据、多一个进程、还要先等下完),见 development-notes 的一节。
92
+ - **UI/交互重构(2026-10-11,按产品/交互/前端三个视角过了一遍)**:
93
+ - **页签**:从"两张描边卡片"改成**一条工作区导航** —— 44px 命中高度、选中项用
94
+ 「文字加重 + 3px 品牌色底部强调线」表达(形状 + 颜色双重,不只靠颜色)、悬停浅底、
95
+ 2px 焦点环、`prefers-reduced-motion` 下不动。两个 tabpanel 元素**常驻**(非选中者是
96
+ `hidden` 空壳),`aria-controls` 在任何时刻都指向真实节点;tablist 补 `aria-orientation`
97
+ 并把 `aria-label` 从工作台名改成「审核页签」。
98
+ - **本地审核**:扫描中**不再显示空态**(改骨架 + `role="status"`,避免误报"还没有选择文件");
99
+ 跳过原因收进 `<details>`(默认不占版面,要查一键展开);整页**只保留一枚主按钮**
100
+ (底部的开始/重试;选择按钮与卡片动作都降为次级);≥1024px **双栏**(左:选择资料 +
101
+ 已选择内容;右:补充提示词与交接),窄屏单栏且不横向溢出;主按钮用 `aria-describedby`
102
+ 关联旁边那句可见的不可点原因;复制成功 `role="status"`、失败 `role="alert"`;
103
+ 滚动区可聚焦(`tabIndex=0`);移除按钮视觉 28px、命中区外扩到 44px。
104
+ - **报告审核**:**审核中的行不再展示「与 DeepSeek 讨论」小鲸鱼**(用户 2026-10-11 口径)——
105
+ 这一刻该行还没有可讨论的结果,主位已经在说「审核中」,多一枚图标只会让人以为还能做别的;
106
+ 停止 / 查看审核信息仍在 ••• 里,操作没有缺口。其余改动:失败类提示补 `role="alert"`(读屏立刻播报,不再只在视觉上变色);
107
+ 搜索区声明 `role="search"`;`•••` 菜单补 `aria-controls`、方向键/Home/End 导航、
108
+ 打开时焦点移入第一项、关闭(Esc / 选中 / 点外部)时**焦点还给触发按钮**;
109
+ 「停止审核」补行内二次确认(与「重新审核」同一套:先变「确认停止审核」再执行);
110
+ 交付件 ⓘ(18px)与搜索清空 ×(20px)视觉不变、命中区外扩到 44px,× 补 `focus-visible`。
111
+ - 修掉「本地审核的对话没有挂在环境信息里配置的工作空间下」(用户实测):只给 `cwd` **挂不上去**。
112
+ 读了 DSH 自己的客户端产物(`ui-workspace` 的 `reuseOrCreateBlank`):界面在某个工作区里建会话用的是
113
+ `sessions.create({ workspaceId })`,而侧栏「未分组」的判据是 `workspace.sessionIds.includes(id)`
114
+ —— **宿主工作区注册表里的成员关系**,不是 cwd 匹配。现在界面把 `env.workspace.id` 一路带到
115
+ `createLocalAuditSession`,用它建会话;只有拿不到 id 时才退回 `cwd`(至少落在对的目录里)。
116
+ - 修掉「移除文件夹移不掉」(2026-10-11 用户实测):macOS 的目录选择器回 `/x/资料/`(带尾斜杠),
117
+ 而 Host 回的 `item.path` 是去掉过的 —— 界面只比 `selected.includes` 会把它误判成"入口里的某个
118
+ 文件",于是点 X 只是把它塞进排除清单,文件夹纹丝不动。现在选择项一入库就 `trimTrailingSeparators`
119
+ 归一,并且"是入口还是入口里的文件"改为看 **Host 回的 `items`**(权威),拼法归一后比较。
120
+ - 下掉「重新扫描」按钮(用户 2026-10-11 口径:它和移除的交互说不清):移除一个文件/文件夹本身就会
121
+ 立刻重扫一次,辅助操作只剩「清空选择」。真要重扫时清空后重选即可。
122
+ - **本地审核的选择列表展开到文件级**(用户 2026-10-11 第二次口径:「审核文件在扫描后应该完整
123
+ 展示文件名称,右侧有个 X 的 icon,表示移除该文件」):扫描应答新增文件级清单 `files[]`
124
+ (带 `parentPath`),界面在**文件夹行下面逐行**列出每个文件(完整文件名 + 相对路径 + 大小,
125
+ 长名换行不截断),每行右侧一枚 X;入口行也把原来的文字按钮换成同一枚 X。
126
+ 移除分两条语义:入口行的 X 从选择里去掉该入口,文件行的 X 记进**排除清单**并发给 Host
127
+ (`local-audit-status` / `local-audit-start` 新增可选入参 `excluded[]`)—— 所以"移除一个文件"
128
+ 在重新扫描后依然生效,且被移除的文件既不算"读不到"也不出现在快照里。协议 29 → 30。
129
+ - 会话 cwd 改用**界面已经在显示的那个工作区**(`env.workspace.path`)—— 用户指出「我插件的
130
+ 【环境信息】中不是已经规定了工作区吗」:对,面板本来就有它,不该再要求宿主在
131
+ `local-audit-start` 里新回一个字段(那个字段在"界面新、宿主旧"时是空的,才会发出空 cwd)。
132
+ 现在宿主回的值优先(它是案例目录落点的权威)、面板那份兜底;两边都非空且**不一致**时
133
+ 直接拒绝并要求"重新准备文件"(工作空间中途换了,案例目录在旧工作区里,会话罩不住它)。
134
+ - **协议 28 → 29**(我改了跨进程字段却没升协议号,真机上表现为一句看不懂的报错):
135
+ `local-audit-start` 的应答新增 `workspacePath`、`casePath` 的含义也变了。旧宿主**不回**这个字段,
136
+ 新客户端于是拿空串当 cwd 去建会话 —— 用户看到的是
137
+ `创建审核对话失败:… failed to ensure project directory "": ENOENT: mkdir ''`。
138
+ 现在协议号会先把「界面新、宿主旧」拦下来(顶部横幅 + 主按钮禁用 + 说明"完全退出并重新打开")。
139
+ 另加第二道闸:`createLocalAuditSession` 遇到空工作空间路径**一个请求都不发**,文案直接指到重启 profile。
140
+ - **修掉交付件被删掉的数据丢失**(2026-10-11 用户实测第一次真机审核):
141
+ `handoff.sweep()` 原来把「已被认领(`used`)」也当成可清理条件,而 `claim()` 一成功就置 `used` ——
142
+ 于是审核一跑完(甚至还在跑),下一次清理(10 分钟兜底定时器 / 下一次开始本地审核)就把整个
143
+ 案例目录连**交付件 HTML / JSON** 一起删了。现在只清**没人认领**的过期快照;
144
+ 认领过的一律不自动删(记录也留着 —— 自动链路是"客户端先认领一次、模型随后再认领一次",
145
+ 中间清掉会让模型那一次拿到"已过期")。目录落点同时改到员工自己的工作空间下,见下条。
146
+ - **本地审核的会话与案例目录改到员工选定的工作空间下**(用户口径:「本地审核对话应该创建在我
147
+ 环境信息规定的工作区下面」):案例目录从 `os.tmpdir()/crwu-local-audit/<id>` 移到
148
+ `<工作空间>/本地审核/<id>`,新会话的 **cwd = 工作空间路径(逐字)** —— DSH 据此把会话挂到
149
+ 那个工作空间下,而会话的沙箱边界(= cwd)也正好罩住案例目录,对话里的案例内工具写得进去。
150
+ 没选工作空间时 `local-audit-start` 直接拒绝并指向「环境信息」。交付件也因此落在员工自己的目录里。
151
+ - **交付件要写完整路径**(用户实测「在会话中直接点击文件跳转不过去」):界面里的文件链接按
152
+ **会话工作空间根**解析,只写文件名会指到不存在的路径。固定提示词与 `16-local-audit.md` 的
153
+ 收尾格式里新增「交付件(完整路径)」一块,并明确写「不要只写文件名」。
154
+ - 修复客户端能力被**提前快照**导致的"目录选择不可用"(2026-10-11 用户实测二次反馈):
155
+ `portOf()` 曾在 `apply()` 里判一次 `services.uiWorkspace?.pickDirectory` 就把结论固化下来 ——
156
+ 我们的客户端插件比 `ui-workspace` 先激活时,这一条**永远是 undefined**,于是点「选择文件夹」
157
+ 回「当前宿主不支持本机目录选择」。现在 `pickDirectory` / `hostPaths` / `sessions.create` /
158
+ `sessions.using` 全部改成**用时现读**(getter),并在目录能力缺席时**补探一次**(不轮询)。
159
+ 新增两条回归:晚注册的 `uiWorkspace` 仍能选目录、晚注册的 `sessions` 仍能走完
160
+ 「建会话 → 命名发提示词 → 切过去」。
161
+ - 修复选择能力探测与失败文案(2026-10-11 用户实测「当前 DeepSeek Harness 版本不支持本机文件选择」):
162
+ `__DSH_HOST_PATHS__` 是对象 `{ pathFor }` 而不是函数,早先按函数判导致「选择文件」**永远**被误判成不支持
163
+ (该判据此前没有任何单测,替身恰好是函数形状);两条能力改为**分开判**,缺一条不再把另一条按钮
164
+ 一起撤掉(用户问的正是"不能选择文件夹吗");并把「这个宿主不支持」与「这一次打不开」分成两句话 ——
165
+ 后者不再误导用户去"更新宿主"。新增 6 条回归(含"只有文件夹可用时界面给什么")。
166
+ - 已知限制(已确认口径,保持现状):本地审核是**报告审核页里的页签**,而该页受环境门禁保护 ——
167
+ 环境自检不通过时整个 audit 模块(含这两个页签)不渲染。页内那一侧确实不判 `envOk`,
168
+ 但整体可达性仍跟报告审核同一套前置;不动既有门禁语义。
169
+ - 协议升级至 28:旧宿主没有这三条操作,新界面点下去只会 404 —— 必须靠协议号把「界面新、宿主旧」
170
+ 挡在门外。新增 `tests/unit/host-local-audit.test.mjs`(35 条)、`tests/unit/host-local-claim.test.mjs`
171
+ (9 条)与 `tests/unit/client-local-audit.test.mjs`(55 条,含"本地审核不受监控面污染"的源码守卫与**设计 §2–§9 逐字文案契约**)。
172
+
173
+ ## package · 0.0.40 · 2026-10-05 · fix · 普通 DSH 会话支持完整手工审核(协议 26)
174
+
175
+ - 修复复制提示词到新会话后,脚本、知识库、附件下载、OSS 发布、钉钉归档和本人通知因缺少审核子会话身份被统一拒绝的问题。普通会话按选定工作空间下的 `<工作空间>/<流水号>` 校验案例目录,无需登记审核记录或讨论范围;氚云访问仍使用员工凭据与远端权限。
176
+ - 统一案例访问入口:托管审核子会话仍校验本轮案例与附件白名单,已结束、已停止、不完整及待接管状态不得降级为普通会话;已登记讨论会话可以使用全部案例工具,记录和附件清单查询仅允许登记的 ObjectId。
177
+ - `crwu_run_python_script` 通过调用者 Agent 解析 DSH Python,首次手工审核无需先运行一次工作台自动审核来填充缓存。
178
+ - 手工兜底提示词携带选定工作空间的案例路径,先用 `crwu_audit_case_bootstrap` 刷新输入快照,再完成两阶段审核和各交付通道。普通会话遵循自己的 DSH 沙箱策略,本机访问授权与托管审核隔离保持生效。
179
+ - 新增普通会话、托管审核和登记讨论的工具对照回归,覆盖 Windows 路径、写后校验、通知幂等与越界零进程。
180
+
10
181
  ## package · 0.0.39 · 2026-10-05 · feat · 审核 Skill 默认发布最终 HTML 与 JSON 到 OSS
11
182
 
12
183
  - 新增 `crwu-audit/references/15-oss-result-publish.md`,把默认 OSS 双文件发布、精确文件名逐项写后验证、受信目标和非阻塞失败收尾纳入 Skill,而非仅依赖插件提示词。
@@ -165,7 +336,6 @@ false —— DSH 把它当成一次**普通的非零退出**。于是"沙箱里
165
336
  ## package · 0.0.34 · 2026-09-30 · fix · 审核根绑到已选工作空间 + 快照写入带会话策略(协议 24)
166
337
 
167
338
 
168
-
169
339
  现场:点「AI 审核」后,侧栏里新会话出现在**未分组**下,而不是环境信息里选定的工作空间下。
170
340
 
171
341
  - **根因**:DSH 有两条硬规则把"会话 cwd"同时当成两件事,而我们只满足了一件:
package/README.en.md CHANGED
@@ -9,11 +9,22 @@ The **audit workbench** for DeepSeek Harness (DSH): self-check the environment
9
9
  "报告审核" tasks from H3Yun → dispatch exactly one AI audit subagent → watch it, stop it, restart it →
10
10
  auto-upload deliverables to Aliyun OSS → open the cloud-hosted audit opinion.
11
11
 
12
+ Next to the report-audit page there is a sibling tab, **本地审核 (local audit)**: pick local files or
13
+ folders (at most 30 regular files per run); the plugin copies them into a temporary snapshot directory,
14
+ mints a one-shot `handoffId`, then tries to open an **ordinary DSH conversation**, sends the fixed audit
15
+ prompt, and switches to it. When the conversation cannot be created it offers a manual path instead
16
+ (switch to full access → create a conversation → copy the prompt and send it). This flow keeps **no audit
17
+ history, no sidecar, no cross-conversation monitoring, and uploads or downloads nothing** — results live
18
+ only in that conversation and its temporary case directory. The report-audit flow and its deliverables are
19
+ unchanged.
20
+
12
21
  The audit process itself is **not** in this repository; the `crwu-audit` skill family runs it.
13
22
  This repository only *dispatches, watches, and ships back*.
14
23
 
15
24
  The audit Skill's completion contract generates and validates final HTML/JSON after both audit phases, then explicitly uploads and verifies both files under the [OSS publishing contract](skills/crwu/crwu-audit/references/15-oss-result-publish.md). OSS failure preserves local results and is reported separately while independent DingTalk archive and notification continue. Conversation content is not uploaded.
16
25
 
26
+ Report audit now has one report list. Search, paging and refresh first load the H3Yun page, then submit its valid, deduplicated serial numbers to the Host in one batch. The Host queries at most three OSS directories concurrently. The **AI audit result** column stays compact: it shows a small empty tag or the delivery count, and an info icon reveals report/data details on hover. Refresh does not scan the root audit prefix or rerun environment checks.
27
+
17
28
  One form only: `src/` is the single source, bundled by tsdown into `lib/index.js` (Host) and
18
29
  `lib/client.js` (Client), distributed as a DSH **package** plugin (npm / tarball / git).
19
30
  Migration history: [`PORTING.md`](PORTING.md).
@@ -112,6 +123,12 @@ Building the tarball yourself (from the `crwu-ai` repository): `make plugin-pack
112
123
  > root and child sessions are always `workspace-write` with `approval=never`, and the account-connection
113
124
  > step also offers a read-only `.dws` checkup with a second-confirmed permission repair.
114
125
 
126
+ ### Manual audit in a new DSH session
127
+
128
+ The fallback prompt carries the selected workspace's case directory and refreshes the record/attachment input snapshot with `crwu_audit_case_bootstrap`. Ordinary sessions can run scripts, materialize knowledge, download attachments, publish to OSS, archive to DingTalk, and notify themselves without registering an audit child or discussion session. Keep the workspace, case path, employee logins, and local-access consent ready; the session's own DSH sandbox policy still applies.
129
+
130
+ Managed audit children remain bound to their current case and attachment manifest, including after stopping. Registered discussions can use case tools and query their own report. After updating, fully quit and restart DSH, then copy the prompt again.
131
+
115
132
  ### Updating CRWU (self-update, from 0.0.12)
116
133
 
117
134
  **Where to look:** the version badge in the sidebar card header and in the panel header (`dev` / `v0.0.12`)
@@ -299,5 +316,5 @@ That keeps the test run to `node --test` with no vitest, jsdom, or react-dom —
299
316
  panel renders in its loading / loaded / failed / unmounted states, what `apply` registers into which slot
300
317
  inside which lifecycle effect, and that the stylesheet uses DSH theme tokens instead of hard-coded colors.
301
318
  The panel's *visual* behaviour (does it render, does the sidebar grouped card hold its three sub-items
302
- inside one card, does switching modules re-list OSS) is checked in a real browser by `install/browser-check.mjs` — see the
319
+ inside one card, does each page query only its own OSS directories) is checked in a real browser by `install/browser-check.mjs` — see the
303
320
  verification checklist in the Chinese README.
package/README.md CHANGED
@@ -8,6 +8,15 @@
8
8
  DeepSeek Harness(DSH)里的**审核工作台**:环境自检 → 从氚云拉「报告审核」待办 → 一次只发起一条
9
9
  AI 审核子会话 → 盯住它的运行状态、可随时停止/重启 → 交付件自动上阿里云 OSS → 直接打开云端审核意见。
10
10
 
11
+ 报告审核只保留「报告列表」:搜索、翻页和刷新先读取氚云对应分页,再将本页合法、去重后的流水号一次提交给 Host,最多并发查询 3 个 OSS 目录。查看审核报告、JSON 摘要和 DeepSeek 结果分析都在报告行;失败行可单独重试,刷新不扫描总前缀或重新自检。
12
+
13
+ 「报告审核」页旁边还有一个并列页签「**本地审核**」:选本机文件或文件夹(单次最多 30 个普通文件),
14
+ 插件把选中内容复制进一个临时快照目录并生成一次性 `handoffId`,再尝试开一条**普通 DSH 对话**把固定
15
+ 审核提示词发过去、自动切过去。会话建不起来时给一条人工路径:切完全权限 → 新建对话 → 复制提示词粘贴发送。
16
+ 这条链路**不保存审核历史、不加 sidecar、不监控其他对话、不上传或下载任何产物**,结果只存在于那次对话
17
+ 与那个临时案例目录里;报告审核的既有流程与交付件一个字不变。细节见
18
+ [本地审核实现契约](https://github.com/mmungdong/crwu-ai/blob/main/docs/superpowers/plans/2026-10-11-workbench-local-audit.md)。
19
+
11
20
  审核流程本体不在本仓:它由 `crwu-audit` 技能族执行(见「依赖」)。本仓只负责**发起、盯状态、交付件回传**。
12
21
 
13
22
  审核 Skill 的收尾契约:完整两阶段审核后生成并校验最终 HTML/JSON,按 [OSS 发布契约](skills/crwu/crwu-audit/references/15-oss-result-publish.md) 显式上传双文件并逐项写后验证。OSS 失败保留本地成果、如实报告,继续独立的钉钉归档与通知;不上传会话内容。
@@ -50,7 +59,7 @@ AI 审核子会话 → 盯住它的运行状态、可随时停止/重启 → 交
50
59
  | 1 | 客户端产物是 `window.__ModuleLoader__.load({ id, factory })` 且 id 等于包名 | `npm run pack:assert` | ✅ |
51
60
  | 2 | 客户端产物只 require `react` / `react/jsx-runtime`(DSH 模块表只保证这两个) | `npm run pack:assert` | ✅ |
52
61
  | 3 | Host 产物是 ESM 且导出 `apply` / `name` / `inject` | `npm run pack:assert` | ✅ |
53
- | 4 | 38 个操作仍在注册表里(冻结清单见 `tests/helpers/frozen-inventory.mjs`;协议 22 删掉了三条登录操作),且门面发出的操作都已登记为 ported | `tests/unit/host-package.test.mjs` | ✅ |
62
+ | 4 | 42 个操作仍在注册表里(冻结清单见 `tests/helpers/frozen-inventory.mjs`;协议 22 删掉了三条登录操作、协议 28 加了本地审核三条),且门面发出的操作都已登记为 ported | `tests/unit/host-package.test.mjs` | ✅ |
54
63
  | 4b | **构建产物**能被加载:`lib/index.js` 真的应答 RPC、`lib/client.js` 过 `__ModuleLoader__` 并注册四个槽位 | `npm run smoke:built`(已含在 `npm run check`) | ✅ |
55
64
  | 4c | 迁移等价性(旧形态的每个组件 / 槽位 / RPC 调用都有 `src` 落点) | 该测试已随旧形态退休;收尾前它一直是绿的,逐项账见 `PORTING.md` | ✅ 已退休 |
56
65
  | 4d | 客户端产物**真的被 DSH 服务并登记进 web 启动清单**(`id` / `url` / `rev` / `inject`) | 装一次后取页面里的 `__DSH_BOOT__` | ✅ |
@@ -111,12 +120,11 @@ node <仓库>/install/browser-check.mjs \
111
120
  | **未选定 / 目录已消失的工作空间** | **阻塞项**:审核产物没有落地目录。插件**不创建**工作空间根目录、也不静默切到父会话 cwd —— 未选定时提示「尚未选择工作空间,请选择一个已经存在的目录」;选过的目录不存在时提示「已选定的工作空间目录不在了」,只允许重新选一个已有目录或走「恢复自动识别」。允许自动创建的**只有** `<工作空间>/<流水号>` 这一级案例目录 |
112
121
  | 全页面没有 `audit-start` | 除了人自己点「AI 审核」,验收脚本全程不发这个操作 |
113
122
  | ① 案例根目录 | **只讲插件选定的那个目录**,不拿"当前会话"说事 —— 从哪个工作空间的会话点进来都一样(会话事实在 ⑧ 里如实展示) |
114
- | 待审核报告页 | 画出真实氚云待办:`共 8610 条`、六列(报告名 / 流水号 / **风险等级** / 人工复核 / 氚云更新时间 / 操作)、真实项目名与流水号、**风险等级徽章 A/B/C**(A 红、B 黄)、复核级次「初审」、行内「已停止 / 已完成·已上云」徽章与「查看会话 / 审核信息 / 本机 HTML」入口;窄列不换行、整表无横向溢出 |
115
- | AI审核结果页 | 画出 4 个真实云端案例及其 `审核意见.*.html` + `审核结果.*.json` 交付件;**这一页自己的工具条**可以按流水号查交付件(输入 → 「查找」→ 只列那一个流水号;没命中就说「OSS 上没有这个流水号的交付件」;「清空」回到全量且不重新列举 OSS;输入过程不发任何请求)|
123
+ | 报告列表 | 七列业务分页,人工复核与 AI 审核结果独立展示;无交付件显示紧凑 Tag,有交付件显示数量并悬浮查看审核报告/数据;查看报告、审核信息、结果分析与原始报告讨论合并到报告行 |
116
124
  | **「审核信息」右侧抽屉** | 点开一条真实记录:抽屉从右侧滑出(固定贴视口右边、占满高度、带遮罩),渲染出 `项目编号` / `审核时间` / `引擎版本` / `报告版本` / `阶段` / `结论` / `问题总数 13`(高 2 中 9 低 2 待确认 2 未检查 3)/ `复核状态` / `命中率` / `复核计数` / `生成时间`,**不再报「审核结果不是合法 JSON」**(第 26 轮修掉的那个缺陷,这条断言已拿还原后的旧代码证伪);关闭后遮罩一起收掉、列表还在原处 |
117
125
  | **加载态** | 翻页与「重新自检」都会出现进度条 + 正文压暗(脚本把这一次请求人为拖慢 3 秒来断言,请求回来后加载态必须收掉) |
118
- | **翻页不重复列举 OSS** | 点「下一页」:`pending` 真的重取(第 2 页),`oss-index` 次数不变(AGENTS.md §4.4 的硬要求) |
119
- | **切标签不重复列举 OSS** | 在「待审核报告 / AI审核结果」之间来回切 3 轮,`oss-index` 调用次数 **1 → 1**(AGENTS.md §4.4 的硬要求) |
126
+ | **当前页定向 OSS 查询** | 翻页先重取 `pending`,再发送一次 `oss-index({ seqNos })`;流水号与本页合法、去重业务行一致,空页不请求 OSS |
127
+ | **单列表搜索与失败** | 无顶部切换 Tab;仅提交/清空搜索时重新取氚云分页,再补齐该页 OSS;查询失败按行展示,可只重试该流水号 |
120
128
  | 切回环境信息 | 点侧栏卡上的「环境信息」仍然正常渲染,说明来回切换没有把状态弄坏 |
121
129
  | 面板滚动 | 面板自己拥有滚动(正文区 `overflow:auto`,头部不随滚动):环境信息与报告审核两页的长内容都能滚到底,横向零溢出 |
122
130
  | 浏览器控制台 | **零报错** |
@@ -175,6 +183,13 @@ node <仓库>/install/browser-check.mjs \
175
183
 
176
184
  `DSH_PERMISSION_MODE=danger-full-access` 只在**开发自测**(§「真实验证」里那个临时 profile)才需要。
177
185
 
186
+ ### 在 DSH 新会话中手工审核
187
+
188
+ 手工兜底提示词携带选定工作空间的案例目录,并先用 `crwu_audit_case_bootstrap` 刷新记录和附件输入快照。普通会话无需登记审核子会话或讨论范围,即可运行脚本、下载知识与附件、发布 OSS、钉钉归档和通知本人。请先准备工作空间、案例路径、员工登录和本机访问授权;执行仍遵循该会话自己的 DSH 沙箱策略。
189
+
190
+ 托管审核子会话继续限定本轮案例和附件清单,停止后也不得转为普通权限。已登记讨论会话可使用案例工具并查询自己的报告。更新插件后完整退出并重启 DSH,再重新复制提示词。
191
+
192
+
178
193
  ### 不需要任何 PATH 配置(2026-09-25 起,且**不要再加回来**)
179
194
 
180
195
  `crwu` / `dws` / `ossutil` 随插件发布在包内 `bin/<平台>/`,插件用**包内绝对路径**经 `ctx.shell`
Binary file
package/bin/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": "crwu.plugin-bin-manifest.v1",
3
- "generatedAt": "2026-10-05T06:35:26.570Z",
3
+ "generatedAt": "2026-10-10T07:57:03.759Z",
4
4
  "platforms": [
5
5
  {
6
6
  "platform": "darwin-arm64",
@@ -12,9 +12,9 @@
12
12
  "source": "repo-build",
13
13
  "sourceVersion": "0.0.1",
14
14
  "target": "darwin/arm64",
15
- "buildCommit": "7d713b651b913e99b0e7094ae64a8402f27957a6",
15
+ "buildCommit": "714ab71b21117fe717e7f64ce928be668c046de5",
16
16
  "size": 7351330,
17
- "sha256": "1d989a152e2ee0d8e1724ba1ceeb6fc425eb5d41da5f967e56dd78d9fc199318"
17
+ "sha256": "0e9ab228f82e9d9c203d4fbcba7ac5f5a0ad40c8308a4187eca9b55a6aed0df4"
18
18
  },
19
19
  {
20
20
  "tool": "ossutil",
@@ -50,9 +50,9 @@
50
50
  "source": "repo-build",
51
51
  "sourceVersion": "0.0.1",
52
52
  "target": "windows/amd64",
53
- "buildCommit": "7d713b651b913e99b0e7094ae64a8402f27957a6",
53
+ "buildCommit": "714ab71b21117fe717e7f64ce928be668c046de5",
54
54
  "size": 8128000,
55
- "sha256": "14a97c0c3cccd89735bac07f12685f21563f82d141d9dd87dabc94240eccdf81"
55
+ "sha256": "9a608b6a4b60d4f6ee12b5f4e0c946e1fdbaa9fd1f8f123d734cb773fcb49b36"
56
56
  },
57
57
  {
58
58
  "tool": "ossutil",
Binary file