Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 15 additions & 14 deletions PRIVACY.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
# Task-agnostic feedback privacy contract

Plugin Lab v3 允许上传一个经过用户确认的体验大类,但不允许上传模型生成的自由文本摘要。界面中的“脱敏 Summary”只是公开插件坐标和有限枚举的固定模板渲染;服务端用同一规则重建,网络协议不接受自由 Summary。
Plugin Lab v4 允许用户在发送前手动编辑一段短 Summary。默认文本仍由公开插件坐标和有限枚举生成;Agent 工具不能填写自由文本,也不会读取日志或会话来生成摘要。用户看到并确认的同一句 Summary 会进入私有反馈后端,但不会进入自动生成的 GitHub 聚合 Issue

## 不变量

1. **封闭影响范围**:Agent 建议只由公开插件坐标和 Host 状态枚举决定,私密任务内容不能影响建议、Summary 或上传包
2. **有限字母表**:网络包只允许协议列出的字段;未知字段直接拒绝,不做“接收后脱敏”。
3. **没有自由摘要字段**:`summary``note`、`reason`、`message` 等字段全部拒绝。可读摘要只由固定模板渲染
1. **Agent 封闭影响范围**:Agent 建议和默认 Summary 只由公开插件坐标与 Host 状态枚举决定;Agent 不能把私密任务内容传入反馈工具。用户手动编辑的 Summary 是唯一例外
2. **有限协议字段**:网络包只允许协议列出的字段;除 `summary` 外的未知字段直接拒绝,不做“接收后脱敏”。
3. **单一受限文本字段**:只接受 1–320 字符、单段、用户可见的 `summary``note`、`reason`、`message`、`log`、`stack` 等其他文本字段仍全部拒绝
4. **宿主真源**:探活只读取 DSH Host 的 Loader/Fiber 状态,不调用目标插件,也不进行文件、网络或数据库 I/O。
5. **Agent 安全胶囊**:探活工具输入为空,输出只有公开插件名/版本、Host 状态、建议大类和允许枚举;预览工具只接受 `experience` 和 `category`;本地准备工具只接受用户明确表达的 `experience`。
6. **最小 UI 锚点**:客户端只读取最终回复的 `messageId` 和时间,把按钮挂到试用后的回复;不读取内容块、Tool 参数或 Tool 结果。
7. **主观状态不臆测**:只有用户点击好用/不好用,或向 Agent 明确表达同一有限评价,才能产生 `source=user_confirmed` 的本地记录;没有明确评价时 Agent 必须询问,健康状态不能自动转换为体验评价。
8. **预览、修改后提交**:体验和 Agent 建议的大类先写入本地草稿并显示完整预览;用户只能修改有限体验枚举与问题大类,插件对象和 Host 状态保持只读。修改会生成新的固定模板草稿,发送仍是独立的逐条确认动作。
8. **预览、编辑后提交**:默认 Summary 先写入本地草稿。用户可以直接编辑 Summary;未点击“应用修改”不得替换草稿,编辑时不显示发送按钮。发送仍是独立的逐条确认动作。
9. **无稳定身份**:没有用户、账号、设备、安装、Session 或跨报告匿名 ID。
10. **无日志派生详情**:不接受日志摘要、错误类型、错误码、堆栈、指纹或哈希;崩溃只能成为 `health=error`
11. **聚合后通知**:GitHub 只接收达到阈值后的大类、状态、体验和报告数,不接收单条报告
10. **不自动采集日志**:插件不读取日志、异常、堆栈、文件或会话。客户端和服务端会拒绝常见的日志行、路径、密钥、URL、邮箱与堆栈形态,但这是防误粘贴护栏,不是完备脱敏器
11. **聚合后通知**:单条 Summary 不参与聚类键;GitHub 只接收达到阈值后的大类、状态、体验和报告数,不接收单条 Summary

## 允许的大类

Expand All @@ -29,24 +29,25 @@ reliability | performance | result_quality | general

- 向 Agent 预览工具加入 `summary/task/log/prompt` 参数必须拒绝整个调用。
- 向 Agent 本地准备工具加入除 `experience` 外的字段必须拒绝整个调用;准备草稿不能获得上传能力。
- 向上传包加入 `summary/note/log/stack/signals/environment/participantId/occurredAt` 必须拒绝整个请求。
- 把邮箱、Token、绝对路径、聊天文本放入会话和异常;本地包与固定摘要不得出现 canary
- 相同公开插件、健康状态、体验和大类下,更换私密任务内容不能改变序列化包
- v3 包加入 `summary` 必须拒绝;v4 只允许 `summary` 与 `summarySource`,加入 `note/log/stack/signals/environment/participantId/occurredAt` 必须拒绝整个请求。
- 把邮箱、Token、绝对路径、URL、日志行或堆栈粘贴进编辑框,客户端与服务端都必须拒绝,错误响应不能回显原文
- 相同公开插件、健康状态、体验和大类下,更换私密会话内容不能改变 Agent 建议或默认 Summary;用户手动编辑的文本除外
- 更换 Assistant 回复正文、Tool 参数或结果,UI 锚点只能保持相同的消息 ID/时间结果,不能返回内容。
- `verbose/debug/include=logs` 不能改变探活结果。
- 未配置 Loader、状态缺失或内部异常只能得到 `unknown`,不能输出异常详情。
- 用户只点击探活、体验或大类时,抓包必须没有反馈请求。
- 用户必须能在发送前看到由插件、版本、状态、体验和大类生成的完整固定 Summary。
- 修改体验或大类时必须实时重算 Summary;未点击“应用修改”不得替换本地草稿,修改状态下不得显示发送按钮。
- 请求体超过 1 KiB 必须在接受字段前拒绝。
- 用户必须能在发送前看到实际将上传的完整 Summary。
- 编辑 Summary 时不做实时模板重算;未点击“应用修改”不得替换本地草稿,修改状态下不得显示发送按钮。
- 请求体超过 2 KiB 必须在接受字段前拒绝。
- 服务端 4xx/5xx 响应不得包含 canary、异常、路径或请求正文。
- 未达到聚合阈值时不能创建 GitHub Issue。

## 明确限制

- 受控大类仍是一条信息,例如 `result_quality` 会说明用户认为“结果质量”值得反馈;因此必须预览并由用户确认。
- 自由 Summary 可能包含用户主动输入的任务信息。正则护栏无法识别所有自然语言隐私,因此项目不再宣称上传包是“零内容”或绝对脱敏;用户必须检查最终预览。
- Agent 已经处在正常会话链路时可能看得到当前任务;本协议保证的是这些内容不能进入反馈工具参数或上传载荷,而不是声称 Agent 从未见过会话。
- `health=ok` 只表示宿主认为插件可运行,不代表用户满意,也不证明业务结果正确。
- 没有稳定身份后,聚合只能统计报告数,不能准确统计独立用户。
- IP、连接时间等传输元数据仍会被网络基础设施瞬时观察;部署者必须通过日志配置和保留策略降低风险,不能宣称绝对匿名。
- v3 不读取、不补传,也不自动删除历史 v1/v2 文件或表。
- v4 兼容读取旧 v3 回执;它不读取、不补传,也不自动删除历史 v1/v2 文件或表。
45 changes: 26 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Oh My DSH Plugin Lab

Plugin Lab 0.6 是面向 DeepSeek Harness rc.6 的隐私优先“体验回执”。默认只有一个轻量入口 `体验回执`:点开同一张票据即可选择插件、让用户或 Agent 准备反馈、确认发送,并持续查看处理进度。它不是插件格子,也不会自动弹窗或常驻展开。
Plugin Lab 0.6 是面向 DeepSeek Harness rc.6 的隐私优先“体验回执”。默认只有一个轻量入口 `体验回执`:点开同一张票据即可选择插件、让用户或 Agent 准备反馈、编辑一段短摘要、确认发送,并持续查看处理进度。它不是插件格子,也不会自动弹窗或常驻展开。

插件确实参与一次 Agent 回复时,该回复下方还会出现就地 `👍 👎`,但它只是快捷方式,不是第二个常驻入口。Agent 只接收一个安全胶囊:公开插件名、版本和 Host 状态枚举。客户端为摆放按钮只读取最新回复的消息 ID 与时间,不读取回复正文;任何反馈工具都不接收任务、文件或日志。

Expand All @@ -9,8 +9,8 @@ Plugin Lab 0.6 是面向 DeepSeek Harness rc.6 的隐私优先“体验回执”
1. 默认只显示一个 `体验回执` 小按钮;未读进展显示数字角标,明确故障或手动选中插件时显示“待反馈”。
2. 点开后可从已安装插件中选择目标。这里仅调用 rc.6 Host 插件清单,读取公开 `moduleName`、启用状态和 Fiber 生命周期枚举,不读取插件配置或内容。
3. 用户可直接点 `👍 👎`,也可明确告诉 Agent“这个插件好用/不好用”。Agent 只能把这一个有限评价交给本地准备工具;用户未表达评价时必须询问,不能根据对话或结果自行猜测。
4. Agent 按 Host 状态固定归类,并在同一张票据中生成发送前预览。Summary 只由公开插件坐标和有限枚举拼成;此时只保存到本机,没有网络请求。
5. 点“修改”后可在原位调整 `好用 / 一般 / 不好用` 和问题大类,Summary 会实时重算;点击“应用修改”才替换本地草稿。插件对象与 Host 状态保持只读,选错对象可“取消并重选”。只有点击“确认发送”,所见有限字段才会发送;确认后 Session 历史新增一条独立“体验回执”卡片
4. Agent 按 Host 状态固定归类,并在同一张票据中生成默认 Summary;此时只保存到本机,没有网络请求。
5. 点“修改”后直接编辑这句短 Summary,不做实时重算。点击“应用修改”才替换本地草稿;常见日志、路径、密钥、URL、邮箱和堆栈形态会被拒绝。插件对象、Host 状态和聚合标签保持只读,选错对象可“取消并重选”。只有点击“确认发送”,所见 Summary 和有限字段才会发送
6. 同一入口长期保留本地草稿、等待发送、聚合、公开跟进、修复和复测状态。默认只显示最近 3 条紧凑进度;单条 Summary 和完整历史都由用户按需展开。后端达到聚合阈值后才创建 GitHub Issue。

普通 Agent/模型调用错误、网络错误或“缺少 API Key”不会被自动归因给插件,因为它们不能证明插件本身故障。`体验回执` 入口仍保持可用,但不会据此自动生成差评。
Expand All @@ -24,10 +24,11 @@ flowchart LR
C --> D{"如何表达体验?"}
D -->|"用户点击"| E["👍 / 👎"]
D -->|"用户明确告诉 Agent"| F["Agent 准备有限评价"]
E --> G["本机固定模板预览"]
E --> G["本机 Summary 预览"]
F --> G
G -->|"修改或取消"| G
G -->|"用户确认发送"| H["有限枚举包"]
G -->|"取消"| B
G -->|"用户手动编辑"| G
G -->|"用户确认发送"| H["有限字段 + 所见 Summary"]
H --> I["后端聚合"]
I -->|"达到阈值"| J["GitHub 聚合 Issue"]
J --> K["同一入口查看修复与复测进度"]
Expand All @@ -40,13 +41,13 @@ Agent 可能已经拥有当前任务的正常会话上下文,但 Plugin Lab
```sh
pnpm install
pnpm pack:release
dsh plugin --profile web add ./oh-my-dsh-plugin-lab-0.6.2.tgz
dsh plugin --profile web add ./oh-my-dsh-plugin-lab-0.6.3.tgz
dsh --profile web
```

Plugin Lab 是标准 DSH Bundle:`package.json` 通过 `dsh.bundle.patch` 声明 Host 插件,通过 `dsh.client` 注册一个输入区回执入口和回复下方的上下文快捷操作。插件选择、探活、脱敏预览、确认提交与进度查看都在这一入口中完成。

版本 `0.6.2` 的 Peer 契约从 DSH `0.1.0-rc.6` 起。完整测试会执行真实的 rc.6 打包、安装、Host/Web 启动、Client Loader 注册和卸载。
版本 `0.6.3` 的 Peer 契约从 DSH `0.1.0-rc.6` 起。完整测试会执行真实的 rc.6 打包、安装、Host/Web 启动、Client Loader 注册和卸载。

## 兼容命令与 Agent 工具

Expand Down Expand Up @@ -79,7 +80,7 @@ reliability | performance | result_quality | general

```json
{
"schemaVersion": 3,
"schemaVersion": 4,
"type": "feedback.signal",
"eventId": "随机单次 UUID",
"plugin": {
Expand All @@ -89,34 +90,39 @@ reliability | performance | result_quality | general
"health": "error",
"experience": "bad",
"category": "reliability",
"summary": "插件启动偏慢,但交互仍然清楚。",
"summarySource": "user_edited",
"source": "user_confirmed"
}
```

复测时可以额外出现一个随机、单报告范围的 `retestOfReceiptId`。客户端和服务端拒绝任何其他字段。协议没有 `summary` 自由文本字段;界面和 GitHub 中看到的中文摘要都由上述枚举通过固定模板生成
`summary` 是用户发送前看到的同一句文字,长度为 1–320 字符;`summarySource` 只能是 `template` 或 `user_edited`。复测时可以额外出现一个随机、单报告范围的 `retestOfReceiptId`。客户端和服务端拒绝任何其他字段。后端继续接受旧 v3 固定模板包

不会创建、读取或发送
插件不会自动创建、读取或附加

- 当前任务、任务标签、Prompt、Assistant 回复正文或 Agent memory;
- stdout、stderr、访问日志、应用日志或 Tool 参数/结果;
- exception、错误码、stack、frame、崩溃指纹;
- 文件、代码、路径、URL、环境变量、配置;
- 用户、账号、设备、安装、Session 等稳定标识;
- 客户端时间、locale、OS、架构、计数或时延;
- 备注、理由、模型自由摘要或其他自由文本
- Agent 或模型生成的自由备注;Agent 工具没有编辑 Summary 的参数

本地 v3 文件只有
本地文件只有

```text
$DSH_HOME/omdsh-plugin-lab/
feedback-v3.ndjson
feedback-v4.ndjson
feedback-v3.ndjson # 只读兼容旧草稿与历史
share-requests-v3.ndjson
receipts-v3.ndjson
receipt-seen-v3.ndjson
draft-discards-v3.ndjson
```

目录权限为 `0700`,文件权限为 `0600`。v3 不读取或补传旧版 `.install-id`、`events.ndjson`、`crashes.ndjson` 或 v2 队列;历史文件不会被自动删除。
目录权限为 `0700`,文件权限为 `0600`。v4 会显示并允许处理旧 v3 回执,但不读取或补传旧版 `.install-id`、`events.ndjson`、`crashes.ndjson` 或 v2 队列;历史文件不会被自动删除。

摘要过滤是防误粘贴护栏,不是完整的数据防泄漏系统。它能拒绝常见敏感形态,但无法理解所有自然语言中的隐私;最终发送内容始终需要用户自己检查并确认。

网络传输仍会让服务器或中间层观察 IP、请求时间等元数据,因此项目不宣称绝对匿名。生产部署必须关闭代理、网关、WAF、应用和数据库的请求体日志,并不得把 IP/User-Agent 写入业务数据。

Expand All @@ -142,13 +148,14 @@ Bundle 默认关闭网络发送:

`server/` 提供 Node.js + PostgreSQL 接收器:

- 只接受 schema v3,未知字段 fail closed;
- 请求体上限 1 KiB,错误响应不回显输入或异常;
- 接受旧 schema v3 和受限 Summary 的 schema v4,未知字段 fail closed;
- 请求体上限 2 KiB,错误响应不回显输入或异常;
- 不存 IP、User-Agent、原始请求体或客户端时间;
- 不使用稳定用户 ID,统计口径是“报告数”而非“独立用户数”;
- 按公开插件、版本、health、experience 和 category 聚合;
- 默认同类报告达到 5 条后才创建 GitHub 聚合 Issue;
- GitHub 只接收固定模板和聚合计数,不接收单条反馈、回执 ID或任务信息;
- 单条 Summary 只在反馈后端私下保存,不参与聚类键;
- GitHub 只接收固定聚合模板和计数,不接收单条 Summary、回执 ID 或任务信息;
- Follow Token 只关联一条报告,用于返回修复与复测状态。

生产环境需要:
Expand All @@ -174,4 +181,4 @@ GITHUB_REPORT_THRESHOLD=5
pnpm test:all
```

验证覆盖闭合 Schema、Agent 探活/准备工具、任务内容 canary、单入口选择、修改/取消、两阶段确认、回执进度、Client 真实点击、服务端未知字段拒绝、PostgreSQL v3 列审计、GitHub 固定模板、聚合阈值、回执/复测,以及真实 DSH rc.6 安装与启动生命周期。
验证覆盖 v3/v4 Schema、Agent 探活/准备工具、敏感文本护栏、单入口编辑/取消、两阶段确认、回执进度、Client 真实点击、服务端未知字段拒绝、PostgreSQL 私有 Summary、GitHub 聚合隔离、聚合阈值、回执/复测,以及真实 DSH rc.6 安装与启动生命周期。
Loading