fix(operation-trace): audit every route for misclassified mutations

Systematically cross-checked all 263 route/method pairs against the classifier
and fixed every case where a real change could be mislabelled:

- POST /skills and PUT /skills/<name> were classified as skill_view (read
  bucket), so creating or editing a skill was silently unlogged at the mutation
  level. They now record skill_update.
- The public webhook ingress (/bots/<uuid>) and the embedded chat widget
  (/embed/*) are unauthenticated visitor traffic, not Workspace changes; they
  are dropped instead of logged as create/resource.
- Uploading files and indexing documents (data flowing into a resource) are
  offered as observations so they never fill the log; deleting a knowledge-base
  file is destructive and now records file_delete.
- A plugin's own config-file edit/delete is a plugin change, not an opaque
  resource delete; ordered before the /config rule that also matched it.
- The bucket now comes from the action table (plus 'a read verb is always a
  read'), so a write action can no longer be forced into the read bucket.
- Added agents and files resource families; localized every new action/resource
  type in all nine locales.
This commit is contained in:
TyperBody
2026-09-28 02:17:50 +08:00
parent 67ff4d3054
commit 280be0d7a4
9 changed files with 252 additions and 46 deletions
+10
View File
@@ -2798,6 +2798,8 @@ const enUS = {
member_invitation: 'Member invitation',
operation_log: 'Operation log',
assistant_conversation: 'Assistant conversation',
agent: 'Agent',
file: 'File',
plugin: 'Extension',
plugin_page: 'Extension page',
skill: 'Skill',
@@ -2835,6 +2837,14 @@ const enUS = {
mcp_view: 'View MCP server',
mcp_config: 'Change MCP server',
mcp_delete: 'Delete MCP server',
skill_update: 'Modify skill',
file_view: 'View file',
ingest: 'Ingest data',
file_delete: 'Delete knowledge base file',
ingress: 'External message ingress',
codex_view: 'View Codex authorization',
codex_authorize: 'Authorize Codex',
embed: 'Embedded session',
pipeline_extensions_update: 'Update pipeline extension bindings',
export: 'Export data',
execute: 'Execute task',
+10
View File
@@ -2853,6 +2853,8 @@ const esES = {
member_invitation: 'Invitación de miembro',
operation_log: 'Registro de operaciones',
assistant_conversation: 'Conversación del asistente',
agent: 'Agente',
file: 'Archivo',
plugin: 'Extensión',
plugin_page: 'Página de extensión',
skill: 'Habilidad',
@@ -2890,6 +2892,14 @@ const esES = {
mcp_view: 'Ver servidor MCP',
mcp_config: 'Cambiar servidor MCP',
mcp_delete: 'Eliminar servidor MCP',
skill_update: 'Modificar habilidad',
file_view: 'Ver archivo',
ingest: 'Importar datos',
file_delete: 'Eliminar archivo de la base de conocimiento',
ingress: 'Entrada de mensajes externos',
codex_view: 'Ver autorización de Codex',
codex_authorize: 'Autorizar Codex',
embed: 'Sesión incrustada',
pipeline_extensions_update:
'Actualizar vinculaciones de extensiones del pipeline',
export: 'Exportar datos',
+10
View File
@@ -2816,6 +2816,8 @@ const jaJP = {
member_invitation: 'メンバー招待',
operation_log: '操作ログ',
assistant_conversation: 'アシスタント会話',
agent: 'エージェント',
file: 'ファイル',
plugin: '拡張機能',
plugin_page: '拡張ページ',
skill: 'スキル',
@@ -2853,6 +2855,14 @@ const jaJP = {
mcp_view: 'MCP サーバーを閲覧',
mcp_config: 'MCP サーバーを変更',
mcp_delete: 'MCP サーバーを削除',
skill_update: 'スキルを変更',
file_view: 'ファイルを表示',
ingest: 'データを取り込み',
file_delete: 'ナレッジベースのファイルを削除',
ingress: '外部メッセージ受信',
codex_view: 'Codex 認証を表示',
codex_authorize: 'Codex を認証',
embed: '埋め込みセッション',
pipeline_extensions_update: 'パイプライン拡張の紐付けを変更',
export: 'データをエクスポート',
execute: 'タスクを実行',
+10
View File
@@ -2823,6 +2823,8 @@ const ruRU = {
member_invitation: 'Приглашение участника',
operation_log: 'Журнал операций',
assistant_conversation: 'Сессия ассистента',
agent: 'Агент',
file: 'Файл',
plugin: 'Расширение',
plugin_page: 'Страница расширения',
skill: 'Навык',
@@ -2860,6 +2862,14 @@ const ruRU = {
mcp_view: 'Просмотр сервера MCP',
mcp_config: 'Изменение сервера MCP',
mcp_delete: 'Удаление сервера MCP',
skill_update: 'Изменение навыка',
file_view: 'Просмотр файла',
ingest: 'Импорт данных',
file_delete: 'Удаление файла базы знаний',
ingress: 'Внешний приём сообщений',
codex_view: 'Просмотр авторизации Codex',
codex_authorize: 'Авторизация Codex',
embed: 'Встроенная сессия',
pipeline_extensions_update: 'Изменение привязок расширений конвейера',
export: 'Экспорт данных',
execute: 'Выполнение задачи',
+10
View File
@@ -2750,6 +2750,8 @@ const thTH = {
member_invitation: 'คำเชิญสมาชิก',
operation_log: 'บันทึกการดำเนินการ',
assistant_conversation: 'บทสนทนาผู้ช่วย',
agent: 'เอเจนต์',
file: 'ไฟล์',
plugin: 'ส่วนขยาย',
plugin_page: 'หน้าส่วนขยาย',
skill: 'ทักษะ',
@@ -2787,6 +2789,14 @@ const thTH = {
mcp_view: 'ดูเซิร์ฟเวอร์ MCP',
mcp_config: 'แก้ไขเซิร์ฟเวอร์ MCP',
mcp_delete: 'ลบเซิร์ฟเวอร์ MCP',
skill_update: 'แก้ไขทักษะ',
file_view: 'ดูไฟล์',
ingest: 'นำเข้าข้อมูล',
file_delete: 'ลบไฟล์ฐานความรู้',
ingress: 'การรับข้อความภายนอก',
codex_view: 'ดูการอนุญาต Codex',
codex_authorize: 'อนุญาต Codex',
embed: 'เซสชันฝังตัว',
pipeline_extensions_update: 'แก้ไขการผูกส่วนขยายของไปป์ไลน์',
export: 'ส่งออกข้อมูล',
execute: 'รันงาน',
+10
View File
@@ -2785,6 +2785,8 @@ const viVN = {
member_invitation: 'Lời mời thành viên',
operation_log: 'Nhật ký thao tác',
assistant_conversation: 'Phiên trợ lý',
agent: 'Tác nhân',
file: 'Tệp',
plugin: 'Tiện ích mở rộng',
plugin_page: 'Trang tiện ích',
skill: 'Kỹ năng',
@@ -2822,6 +2824,14 @@ const viVN = {
mcp_view: 'Xem máy chủ MCP',
mcp_config: 'Thay đổi máy chủ MCP',
mcp_delete: 'Xóa máy chủ MCP',
skill_update: 'Sửa kỹ năng',
file_view: 'Xem tệp',
ingest: 'Nhập dữ liệu',
file_delete: 'Xóa tệp cơ sở tri thức',
ingress: 'Nhận tin nhắn bên ngoài',
codex_view: 'Xem ủy quyền Codex',
codex_authorize: 'Ủy quyền Codex',
embed: 'Phiên nhúng',
pipeline_extensions_update: 'Cập nhật liên kết tiện ích của pipeline',
export: 'Xuất dữ liệu',
execute: 'Chạy tác vụ',
+10
View File
@@ -2648,6 +2648,8 @@ const zhHans = {
member_invitation: '成员邀请',
operation_log: '操作日志',
assistant_conversation: '助手会话',
agent: '智能体',
file: '文件',
plugin: '扩展',
plugin_page: '扩展页面',
skill: '技能',
@@ -2685,6 +2687,14 @@ const zhHans = {
mcp_view: '查看 MCP 服务器',
mcp_config: '修改 MCP 服务器',
mcp_delete: '删除 MCP 服务器',
skill_update: '修改技能',
file_view: '查看文件',
ingest: '导入数据',
file_delete: '删除知识库文件',
ingress: '外部消息接入',
codex_view: '查看 Codex 授权',
codex_authorize: '授权 Codex',
embed: '嵌入式会话',
pipeline_extensions_update: '修改管道扩展绑定',
export: '导出数据',
execute: '执行任务',
+10
View File
@@ -2649,6 +2649,8 @@ const zhHant = {
member_invitation: '成員邀請',
operation_log: '操作日誌',
assistant_conversation: '助手會話',
agent: '智慧代理',
file: '檔案',
plugin: '擴充',
plugin_page: '擴充頁面',
skill: '技能',
@@ -2686,6 +2688,14 @@ const zhHant = {
mcp_view: '查看 MCP 伺服器',
mcp_config: '修改 MCP 伺服器',
mcp_delete: '刪除 MCP 伺服器',
skill_update: '修改技能',
file_view: '查看檔案',
ingest: '匯入資料',
file_delete: '刪除知識庫檔案',
ingress: '外部訊息接入',
codex_view: '查看 Codex 授權',
codex_authorize: '授權 Codex',
embed: '嵌入式工作階段',
pipeline_extensions_update: '修改管道擴展綁定',
export: '匯出資料',
execute: '執行任務',