# 安全边界与日志记录

> 每一次代理写入共用的那些出口、校验和锁，以及每一次动作留下的那条痕迹。

代理不是进入工作站的第二条路。每一次调用都落在那些页面所调的同一段代码里，受同样的锁约束，也留下和操作员动作一样的痕迹。

## 每一次写入共用的安全边界 {#guardrails-every-write-shares}

- **和界面共用同样的出口。** 配置类的写入走的是和那些页面一样的下发与用例服务，实时写入搭的是那唯一一道逻辑写入出口，而运行控制搭的是 Process 的生命周期。不存在一条平行的通路，能让代理绕开校验、锁或者日志记录。
- **和编辑器一个级别的校验。** upsert 类工具把传进来的参数合并到已有的声明之上，再用编辑器所用的同一批规则去校验合并之后的草稿。一次被拒绝的 upsert 不会留下任何做了一半的东西。
- **工程锁定同样生效。** 有一个 Process 单元在运行期间，配置类改动会被拒绝，返回一个结构化的“有单元在运行时，配置被锁定”结果，并点名要先结束什么，和那些页面拒绝它们的方式一模一样。
- **运行时停止时是只读的。** 工作站运行时停止时，只有查看、状态、列表、帮助（`help_search`、`help_read`）、报告导出、备份快照和界面定位（`ui_state`、`ui_navigate`、`ui_screenshot`、`ui_scroll`）还能用；每一次会改动东西的调用都答 `Runtime stopped`，哪怕它那个范围的开关是开着的。将来新加的工具在被有意归类为只读之前，一律按拒绝处理。
- **破坏性的工具被标出来。** 那些会给设备下命令或者毁掉数据的工具（`tag_write`、`action_run`、`process_recipe_apply`、`process_start`、`process_resume`、各种删除、`server_stop`，等等）带着 MCP 的破坏性标志，所以即使是那些会自动批准安全工具的客户端，遇到这些也还是会先问一声。

## 代理的动作怎样记进日志 {#how-agent-actions-journal}

代理做的每一件事，都在你本来就会去看的那些地方，留下和操作员动作一样的痕迹：

- endpoint 的生命周期、代理那一侧的每一次配置改动，以及每一次被拒绝的浏览器探测，都记在[事件](events)控制台的**Agent**区域下面（`logs_read` 可以直接按它筛选）。
- 逻辑运行时里的实时操作（变量写入、点位写入、动作运行、报警确认）以来源 **MCP** 记进日志，和从界面上做的同样那些操作并排；报警历史和动作的“触发来源”一行则写作**代理**。
- 代理启动、停止、中止或者加了备注的那些运行，在运行记录文件里和[历史](histories)里都把**代理**记为执行者，这样绝不会把某个人的名字安在他没做过的事情上。
- 那份常驻的事件历史对代理来说只能追加：`event_history_read` 既清不掉也删不掉任何东西。
- 代理在界面上每一次改变了东西的操作（`ui_click`、`ui_set_text`、`ui_select`、`ui_set_theme`）都在**Agent**区域下面留一行，写明工具、操作的对象和页面，从不写下输入的文字。这些行进入程序的日志文件（`logs` 文件夹，见[安装与首次启动](app-install)）和[详细捕获](events-console#detailed-capture)，不进控制台的列表，所以一长串自动操作不会把警告和错误挤出列表。操作引起的事情照常记在控制台里。
