AIDAWORK / ARCHITECTURE

可观测 / 排障地图

独立图页 ↗
机制说明(SoT)图是辅读 · 结论以说明与证据为准

把诊断码当成入口:先辨认是 协议硬门、Run/Plugin 执行 还是 本机/Schema 存储,再顺着 产出面 → 落点 → 排障入口 查。

本页可直接往下读完整机制说明,不需要「演示 / 播放故事」。术语不熟先看 术语表。

先读机制说明,结论以说明与证据为准 · 基于固定代码版本核验 · 部署状态另行确认

机制说明(全文)

可观测 / 排障地图

怎么读

把诊断码当成入口:先辨认是 协议硬门、Run/Plugin 执行 还是 本机/Schema 存储,再顺着 产出面 → 落点 → 排障入口 查。

诊断码 / 现象 产出面 落点 排障入口
DESKTOP_UPGRADE_REQUIRED Chat HTTP 426(头有值且≠3,或无头却带本机执行载荷;ADR-0093)(及本机执行回执、Local File 回执/投递、durable recovery、桌面分发) 不创建 agent_runs 升级到 Desktop 协议 v3;旧码 LOCAL_FILE_PROTOCOL_UPGRADE_REQUIRED 已删除;见 fail-426-lf / ok-426-lf
interaction_protocol_upgrade_required IX API JSON 426 不进 Kernel 协议头=2;见 fail-426-ix / ok-426-ix
RUNTIME_EXECUTION_PROTOCOL_UNSUPPORTED Gateway 426 Runtime 路径阻断 非支持的提交 wire;work-v1 与 skill-v2 还需 policy 匹配,不能套用取消路由的门;见 协议地图
RUN_LEASE_LOST / RUN_LEASE_BUSY UnifiedEntry → SSE retryable agent_runs.error_code / lease 字段 在办投影 + 稍后重试;见 fail-lease-mid / ok-lease-mid
PLUGIN_TASK_UNAVAILABLE / journal uncertain PluginHost / 工具回执 本机 CallJournal phase 查投影与 journal 文件;见 fail-manifest / fail-plugin-settle
RUNTIME_WORK_MESSAGE_TOO_LONG Chat HTTP 400(受理前,带 chatAdmission.status=rejected) 不建会话、不受理 缩短后重发;Desktop 保留草稿
UI_MESSAGE_READ_ONLY / UI_MESSAGE_LEDGER_UNAVAILABLE GET /api/runs/:runId/stream(只读 AI SDK 消息流)405 / 503 run_projection_events 的 chat_sse 账本 只读重放,不推进执行;见下文
CAPTURE_DISABLED / CAPTURE_DESKTOP_IDENTITY_REQUIRED /api/trajectory-delivery 503 / 403 Redis 临时传输(无持久化) 检查 chat 角色 Redis;归档在 Desktop Main
LOCAL_FILE_WRITE_STATE_LEGACY_DROPPED Main diagnostic write-state-v4(加密信封,LocalSecureEnvelope) 本机文件;见 fail-atomic / ok-atomic
schema identity assert fail Boot throw / 进程日志 config_schema_identity(另要求 messages 为普通表,否则提示先执行 181) 审阅迁移后重启;见 fail-schema / ok-schema
ATTENTION_SNAPSHOT_CHANGED / ATTENTION_READ_LIMIT GET /api/work/attention 409 / 503 只读快照,不写库 清空分页重拉首页;见下文
aida_* 运行时指标 /metrics(Prometheus) 进程内计数,标签无租户 / 用户 / run id 受理结果、排队时长、LLM_BUSY、首发耗时;见下文

失败/成功链总索引:../FAILURE-CHAINS.md。

Work SSE:路由决策投影与续跑通知(2026-10-13 钉点)

  • capability_route_decision:Work 观察流只转发脱敏投影——status 与已选能力(primaryCapabilityId 及其置信信号;refused 时为空),不下发其它候选、原话或抽取槽位。
  • run_recovering:实例下线排空时发 reasonCode: SERVER_DRAINING 后正常结束流。租约丢失/中断的 Run 由 decideOwnerLostRecovery 决定:未产生写入提案/来源写入且未发布回复的轮次回 pending 重新领取(有上限),已写入或超限转 manual_recovery(*_AFTER_WRITE)。
  • Desktop(钉点 8eecd12081db)收到 run_recovering 只在界面显示「续跑中…」(active / processing,60 秒权威窗口),不改服务端 Run 状态。

只读 Run 消息流与诊断轨迹(钉点 e2adc9a3c325 / 8eecd12081db)

  • 只读 AI SDK 消息流:GET /api/runs/:runId/stream 复用拥有者可见性鉴权,从 chat_sse 账本按序号整条重放;POST /api/runs 与非 GET 的 /:runId/stream 一律 405 UI_MESSAGE_READ_ONLY,拒绝 SDK 自动审批回写。生产 Chat Work 的公开事实由 common-control 事务在 savepoint 里写入 run_projection_events(每 Root 10000 条 / 16 MiB,超限或投影失败写 chat_sse_truncated,Work 核心状态照常提交;见 storage-planes)。
  • 诊断轨迹交付:Agent 只在 chat 角色、Redis 可连通时开 RedisDesktopTrajectoryDelivery(TTL 300s、8 MiB、10000 事件、每主体 8 会话),这只是临时传输;Desktop Main 的 DesktopTrajectoryStore 是唯一持久日志与本地归档,由 Main 的 developer 模式与轨迹面板偏好共同控制,新任务提交时自动准备采集,不再提供独立 start-capture 控件/IPC;准备握手最多等待 2 秒,迟到结果不得在业务提交后开启采集。身份/设置失效撤销采集,不保存凭证、不授予恢复权限。
  • 流内生命周期(见视图 runs-stream):首读为空或账本不完整返回 409,不把丢失历史当空回复;开流后每轮先重新鉴权(会话或租户变了即中断),按 cursor 增量 listAfter、空批时 250ms 轮询;结束条件是投影 finished、Run 终态、恢复中、300s 期限或重放事件数 / 字节上限,中断时补 interruption 帧再 [DONE]。
  • 证据:aida-agent · packages/agent/src/gateway/api-runs.ts L116–171 · runUIMessageStream · e2adc9a3c325;aida-agent · packages/agent/src/gateway/run-ui-message-stream.ts L35–221 · runUIMessageStream · e2adc9a3c325;aida-agent · packages/agent/src/index.ts L2342–2368 · RedisDesktopTrajectoryDelivery · e2adc9a3c325;aida-agent · packages/agent/src/gateway/api-trajectory-delivery.ts L33–46 · CAPTURE_DESKTOP_IDENTITY_REQUIRED · e2adc9a3c325;aida-desktop · apps/desktop/electron/trajectory/desktop-trajectory-store.ts L40–80 · DesktopTrajectoryStore · 4346d79eb364;aida-agent · packages/agent/src/gateway/chat-routes.ts L560–600 · RUNTIME_WORK_MESSAGE_TOO_LONG · e2adc9a3c325

运行时指标、待办快照与显式 Stop(钉点 e2adc9a3c325,STA-33)

  • 指标基线(MR1,9ed5e3fbc):接入现有 /metrics,标签都是有限枚举。chat 受理结果(accepted / duplicate / not_started{reason} / rejected{status} / unavailable / reply_replayed,每次请求只记一次)、按 quota_bucket 的排队时长、LLM_BUSY 与 LLM 排队等待、首次公开正文发布耗时、reply_user 与兜底发布计数、Worker 名额。记录失败只记日志,不改业务结果。
  • 待办快照(MR3,ba37f6827):GET /api/work/attention 只读、轮询优先,返回本人前台 Work / 后台 Work / 业务事项 / 待办卡(state:running / queued / waiting / needs_action / terminal);只读 repeatable-read + 5 秒期限,候选各限 1000,最近结束 24 小时 / 100 项;游标 HMAC 签名、5 分钟有效,可见集合变了 409。runtime-capabilities 增加 attention { apiVersion: 1, polling: true, enabled }。SSE 订阅留给 MR9。
  • 显式 Stop(ADR-0095 2a-2):Stop 必须指向明确 root run id——POST /api/runs/:runId/work-stop 只停该原工作,GET 同路径只查该命令受理事实;没有会话级批量 Stop;getActiveByConversation / attach fallback / 受理占用都排除后台 root。
  • 证据:aida-agent · packages/agent/src/observability/runtime-metrics.ts L84–136 · recordChatAdmission · e2adc9a3c325;aida-agent · packages/agent/src/gateway/api-work-attention.ts L10–24 · /attention · e2adc9a3c325;aida-agent · packages/agent/src/gateway/work-attention.ts L74–76 · ATTENTION_CANDIDATE_LIMIT · e2adc9a3c325;aida-agent · packages/agent/src/gateway/api-runs.ts L216–250 · work-stop · e2adc9a3c325;aida-agent · packages/agent/src/session/run-store.ts L1785–1820 · listBackgroundByConversation · e2adc9a3c325
  • 未核:指标在各环境是否被采集 / 告警;Desktop 是否已接 attention 接口(本钉点 Desktop 源码未见调用)。

合同 fixture、观察重试、Pack 发布门与超长消息回执(钉点 e2adc9a3c325 / 8eecd12081db)

  • work-attention-v1 fixture:fixtures/desktop-contract/work-attention-v1.json 归 Agent 所有,写明 GET /api/work/attention 的字段、示例和反例(轮询快照、无 SSE 补读、HMAC 游标 5 分钟、变化 409、stop 只在可控前台 root 上),Agent 合同测试按生产 schema 校验;Desktop 消费 / 镜像和 SSE 补读是后续工作。
  • Work 观察超时可重试(89c9bdad3):chat 流观察原 Work 出错时,只有 RUNTIME_WORK_READ_TIMEOUT 标 retryable: true——读预算耗尽不代表 run 失败,run 继续执行;绑定 / 授权失败仍是终局。
  • Pack 发布门 / readyz packs:同一检查跑在部署前脚本(exit 1 阻断)、服务内 readyz(后台刷新)、部署后逐租户冒烟;1d07cf06a 起包含没有订阅行、隐式跟随默认 Pack 的租户。单租户失败 → degraded,全部失败 → unavailable,读不到订阅 → unreachable。
  • Desktop 超长消息回执(9fdc200c):Main 只在 400 响应体完整符合 RUNTIME_WORK_MESSAGE_TOO_LONG 合同、且本条消息确实超长时,才生成绑定原 POST 的拒绝回执;只看状态码或错误码前缀不算。
  • 证据:aida-agent · fixtures/desktop-contract/work-attention-v1.json L1–23 · work-attention-v1 · e2adc9a3c325;aida-agent · fixtures/desktop-contract/README.md L5–8 · work-attention-v1.json · e2adc9a3c325;aida-agent · packages/agent/src/gateway/chat-routes.ts L172–180 · observationErrorRetryable · e2adc9a3c325;aida-agent · packages/agent/src/gateway/chat-routes.ts L1298–1304 · observationErrorRetryable · e2adc9a3c325;aida-agent · packages/agent/src/config/services/pack-release-gate.ts L1–12 · readyz · e2adc9a3c325;aida-agent · packages/agent/src/config/services/pack-release-gate.ts L130–153 · checkAllTenantPacks · e2adc9a3c325;aida-desktop · apps/desktop/electron/agent-loop/runtime-execution-client.ts L73–98 · messageAdmissionRejectionSchema · 4346d79eb364;aida-desktop · apps/desktop/shared/runtime-work-admission-rejection.ts L3–18 · RUNTIME_WORK_MESSAGE_TOO_LONG · 4346d79eb364

readyz:工具契约漂移(2026-10-14 钉点)

ToolContractMonitor 在启动与周期性比对代码声明的后端工具需求与后端 listTools 实际清单;钉点 e2adc9a3c325 起还用进程已加载的工具 schema 比对参数契约(TOOL_ARGUMENT_CONTRACTS:Agent 会发而后端没有的参数、后端必填而 Agent 不发的参数,只报会导致调用失败的差异;未配置后端的域跳过)。结果以 toolContracts(missing + argumentDrift)出现在 readyz;任一漂移只把状态置 degraded、readyz 仍为 200;任一漂移集合变化时发高严重度审计与错误日志,用户指引标注“暂不可用”。

视图

  • main — 诊断码 → 产出面 → DB/本机落点 → 排障入口。
  • runs-stream — 只读 GET /api/runs/:runId/stream:鉴权、账本重放、增量轮询与中断收尾。

归属边与非目标

  • Owner:各码的产出模块(Gateway / UnifiedEntry / PluginHost / Main / Boot)。
  • 非目标:不替代完整错误码表(见 desktop-runtime);不做日志平台接入设计。
  • 相关:enterprise-task-e2e、state-authority、storage-planes、vertical-plugin-mount、trust-boundaries、time-bounds。

证据与范围

  • aida-agent · packages/agent/src/gateway/chat-routes.ts L520–524 · desktopPayloadVersionUnsupported · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/api-conversation-interactions.ts L465–495 · interaction_protocol_upgrade_required · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/chat-routes.ts L381–421 · RUNTIME_EXECUTION_PROTOCOL_UNSUPPORTED · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/unified-entry.ts L2660–2682 · RUN_LEASE_LOST · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/unified-entry.ts L1948–1978 · RUN_LEASE_BUSY · e2adc9a3c325
  • aida-desktop · apps/desktop/electron/local-files-v4/write-state-persistence.ts L730–746 · LOCAL_FILE_WRITE_STATE_LEGACY_DROPPED · 4346d79eb364
  • aida-agent · packages/agent/src/config/schema-identity.ts L661–701 · assertCurrentConfigSchema · e2adc9a3c325
  • aida-agent · packages/agent/src/connectors/tool-contract-monitor.ts L1–16 · readyz · e2adc9a3c325
  • aida-agent · packages/agent/src/connectors/tool-contract-monitor.ts L229–251 · argumentDrift · e2adc9a3c325
  • aida-agent · packages/agent/src/connectors/tool-argument-contracts.ts L192–219 · evaluateToolArgumentContracts · e2adc9a3c325

结论来自固定版本的静态源码与合同阅读;实现存在、默认开关和生产启用分别判断。本站代码证据面板列出声明状态与具体限制。

  • aida-agent · packages/agent/src/gateway/chat-work-sse-response.ts L27–41 · projectRouteDecisionEvent · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/chat-work-sse-response.ts L127–132 · SERVER_DRAINING · e2adc9a3c325
  • aida-agent · packages/agent/src/runtime/execution/run-execution-storage.ts L952–968 · decideOwnerLostRecovery · e2adc9a3c325
  • aida-desktop · apps/desktop/src/chat/core/runTimeline.ts L444–453 · run_recovering · 4346d79eb364

Desktop 轨迹采集更新(2026-10-29)

Main captureIdentity 要求 isDeveloper() 与 isPanelVisible() 同时成立;prepareSubmission 以 clientRequestId 去重并限制诊断等待,诊断失败不创造 Run 失败。invalidate 增加 epoch、清除当前采集身份并停止交付。证据:aida-desktop · apps/desktop/electron/trajectory/desktop-trajectory-controller.ts L100–105 / L81–134 · 4346d79eb364。这是代码静态复核,不代表真机采集验收。

Runtime 提交 wire 与原 Work identity

chat POST 的 Runtime 提交门接受缺省/空值(无 policy)、runtime-work-v1(无 policy),以及 runtime-work-skill-v2 且携带合法 skillExecutionPolicy;其他非空头为 RUNTIME_EXECUTION_PROTOCOL_UNSUPPORTED,头与 policy 不匹配为 RUNTIME_WORK_SKILL_POLICY_MISMATCH,均返回 426。原 Work binding 仍是 runtime-work-v1;取消提交、补充材料等路由单独判定,见协议地图。

证据:提交门 与 实际 chat POST 调用。

机制说明

可观测 / 排障地图

怎么读

把诊断码当成入口:先辨认是 协议硬门、Run/Plugin 执行 还是 本机/Schema 存储,再顺着 产出面 → 落点 → 排障入口 查。

诊断码 / 现象 产出面 落点 排障入口
DESKTOP_UPGRADE_REQUIRED Chat HTTP 426(头有值且≠3,或无头却带本机执行载荷;ADR-0093)(及本机执行回执、Local File 回执/投递、durable recovery、桌面分发) 不创建 agent_runs 升级到 Desktop 协议 v3;旧码 LOCAL_FILE_PROTOCOL_UPGRADE_REQUIRED 已删除;见 fail-426-lf / ok-426-lf
interaction_protocol_upgrade_required IX API JSON 426 不进 Kernel 协议头=2;见 fail-426-ix / ok-426-ix
RUNTIME_EXECUTION_PROTOCOL_UNSUPPORTED Gateway 426 Runtime 路径阻断 非支持的提交 wire;work-v1 与 skill-v2 还需 policy 匹配,不能套用取消路由的门;见 协议地图
RUN_LEASE_LOST / RUN_LEASE_BUSY UnifiedEntry → SSE retryable agent_runs.error_code / lease 字段 在办投影 + 稍后重试;见 fail-lease-mid / ok-lease-mid
PLUGIN_TASK_UNAVAILABLE / journal uncertain PluginHost / 工具回执 本机 CallJournal phase 查投影与 journal 文件;见 fail-manifest / fail-plugin-settle
RUNTIME_WORK_MESSAGE_TOO_LONG Chat HTTP 400(受理前,带 chatAdmission.status=rejected) 不建会话、不受理 缩短后重发;Desktop 保留草稿
UI_MESSAGE_READ_ONLY / UI_MESSAGE_LEDGER_UNAVAILABLE GET /api/runs/:runId/stream(只读 AI SDK 消息流)405 / 503 run_projection_events 的 chat_sse 账本 只读重放,不推进执行;见下文
CAPTURE_DISABLED / CAPTURE_DESKTOP_IDENTITY_REQUIRED /api/trajectory-delivery 503 / 403 Redis 临时传输(无持久化) 检查 chat 角色 Redis;归档在 Desktop Main
LOCAL_FILE_WRITE_STATE_LEGACY_DROPPED Main diagnostic write-state-v4(加密信封,LocalSecureEnvelope) 本机文件;见 fail-atomic / ok-atomic
schema identity assert fail Boot throw / 进程日志 config_schema_identity(另要求 messages 为普通表,否则提示先执行 181) 审阅迁移后重启;见 fail-schema / ok-schema
ATTENTION_SNAPSHOT_CHANGED / ATTENTION_READ_LIMIT GET /api/work/attention 409 / 503 只读快照,不写库 清空分页重拉首页;见下文
aida_* 运行时指标 /metrics(Prometheus) 进程内计数,标签无租户 / 用户 / run id 受理结果、排队时长、LLM_BUSY、首发耗时;见下文

失败/成功链总索引:../FAILURE-CHAINS.md。

Work SSE:路由决策投影与续跑通知(2026-10-13 钉点)

  • capability_route_decision:Work 观察流只转发脱敏投影——status 与已选能力(primaryCapabilityId 及其置信信号;refused 时为空),不下发其它候选、原话或抽取槽位。
  • run_recovering:实例下线排空时发 reasonCode: SERVER_DRAINING 后正常结束流。租约丢失/中断的 Run 由 decideOwnerLostRecovery 决定:未产生写入提案/来源写入且未发布回复的轮次回 pending 重新领取(有上限),已写入或超限转 manual_recovery(*_AFTER_WRITE)。
  • Desktop(钉点 8eecd12081db)收到 run_recovering 只在界面显示「续跑中…」(active / processing,60 秒权威窗口),不改服务端 Run 状态。

只读 Run 消息流与诊断轨迹(钉点 e2adc9a3c325 / 8eecd12081db)

  • 只读 AI SDK 消息流:GET /api/runs/:runId/stream 复用拥有者可见性鉴权,从 chat_sse 账本按序号整条重放;POST /api/runs 与非 GET 的 /:runId/stream 一律 405 UI_MESSAGE_READ_ONLY,拒绝 SDK 自动审批回写。生产 Chat Work 的公开事实由 common-control 事务在 savepoint 里写入 run_projection_events(每 Root 10000 条 / 16 MiB,超限或投影失败写 chat_sse_truncated,Work 核心状态照常提交;见 storage-planes)。
  • 诊断轨迹交付:Agent 只在 chat 角色、Redis 可连通时开 RedisDesktopTrajectoryDelivery(TTL 300s、8 MiB、10000 事件、每主体 8 会话),这只是临时传输;Desktop Main 的 DesktopTrajectoryStore 是唯一持久日志与本地归档,由 Main 的 developer 模式与轨迹面板偏好共同控制,新任务提交时自动准备采集,不再提供独立 start-capture 控件/IPC;准备握手最多等待 2 秒,迟到结果不得在业务提交后开启采集。身份/设置失效撤销采集,不保存凭证、不授予恢复权限。
  • 流内生命周期(见视图 runs-stream):首读为空或账本不完整返回 409,不把丢失历史当空回复;开流后每轮先重新鉴权(会话或租户变了即中断),按 cursor 增量 listAfter、空批时 250ms 轮询;结束条件是投影 finished、Run 终态、恢复中、300s 期限或重放事件数 / 字节上限,中断时补 interruption 帧再 [DONE]。
  • 证据:aida-agent · packages/agent/src/gateway/api-runs.ts L116–171 · runUIMessageStream · e2adc9a3c325;aida-agent · packages/agent/src/gateway/run-ui-message-stream.ts L35–221 · runUIMessageStream · e2adc9a3c325;aida-agent · packages/agent/src/index.ts L2342–2368 · RedisDesktopTrajectoryDelivery · e2adc9a3c325;aida-agent · packages/agent/src/gateway/api-trajectory-delivery.ts L33–46 · CAPTURE_DESKTOP_IDENTITY_REQUIRED · e2adc9a3c325;aida-desktop · apps/desktop/electron/trajectory/desktop-trajectory-store.ts L40–80 · DesktopTrajectoryStore · 4346d79eb364;aida-agent · packages/agent/src/gateway/chat-routes.ts L560–600 · RUNTIME_WORK_MESSAGE_TOO_LONG · e2adc9a3c325

运行时指标、待办快照与显式 Stop(钉点 e2adc9a3c325,STA-33)

  • 指标基线(MR1,9ed5e3fbc):接入现有 /metrics,标签都是有限枚举。chat 受理结果(accepted / duplicate / not_started{reason} / rejected{status} / unavailable / reply_replayed,每次请求只记一次)、按 quota_bucket 的排队时长、LLM_BUSY 与 LLM 排队等待、首次公开正文发布耗时、reply_user 与兜底发布计数、Worker 名额。记录失败只记日志,不改业务结果。
  • 待办快照(MR3,ba37f6827):GET /api/work/attention 只读、轮询优先,返回本人前台 Work / 后台 Work / 业务事项 / 待办卡(state:running / queued / waiting / needs_action / terminal);只读 repeatable-read + 5 秒期限,候选各限 1000,最近结束 24 小时 / 100 项;游标 HMAC 签名、5 分钟有效,可见集合变了 409。runtime-capabilities 增加 attention { apiVersion: 1, polling: true, enabled }。SSE 订阅留给 MR9。
  • 显式 Stop(ADR-0095 2a-2):Stop 必须指向明确 root run id——POST /api/runs/:runId/work-stop 只停该原工作,GET 同路径只查该命令受理事实;没有会话级批量 Stop;getActiveByConversation / attach fallback / 受理占用都排除后台 root。
  • 证据:aida-agent · packages/agent/src/observability/runtime-metrics.ts L84–136 · recordChatAdmission · e2adc9a3c325;aida-agent · packages/agent/src/gateway/api-work-attention.ts L10–24 · /attention · e2adc9a3c325;aida-agent · packages/agent/src/gateway/work-attention.ts L74–76 · ATTENTION_CANDIDATE_LIMIT · e2adc9a3c325;aida-agent · packages/agent/src/gateway/api-runs.ts L216–250 · work-stop · e2adc9a3c325;aida-agent · packages/agent/src/session/run-store.ts L1785–1820 · listBackgroundByConversation · e2adc9a3c325
  • 未核:指标在各环境是否被采集 / 告警;Desktop 是否已接 attention 接口(本钉点 Desktop 源码未见调用)。

合同 fixture、观察重试、Pack 发布门与超长消息回执(钉点 e2adc9a3c325 / 8eecd12081db)

  • work-attention-v1 fixture:fixtures/desktop-contract/work-attention-v1.json 归 Agent 所有,写明 GET /api/work/attention 的字段、示例和反例(轮询快照、无 SSE 补读、HMAC 游标 5 分钟、变化 409、stop 只在可控前台 root 上),Agent 合同测试按生产 schema 校验;Desktop 消费 / 镜像和 SSE 补读是后续工作。
  • Work 观察超时可重试(89c9bdad3):chat 流观察原 Work 出错时,只有 RUNTIME_WORK_READ_TIMEOUT 标 retryable: true——读预算耗尽不代表 run 失败,run 继续执行;绑定 / 授权失败仍是终局。
  • Pack 发布门 / readyz packs:同一检查跑在部署前脚本(exit 1 阻断)、服务内 readyz(后台刷新)、部署后逐租户冒烟;1d07cf06a 起包含没有订阅行、隐式跟随默认 Pack 的租户。单租户失败 → degraded,全部失败 → unavailable,读不到订阅 → unreachable。
  • Desktop 超长消息回执(9fdc200c):Main 只在 400 响应体完整符合 RUNTIME_WORK_MESSAGE_TOO_LONG 合同、且本条消息确实超长时,才生成绑定原 POST 的拒绝回执;只看状态码或错误码前缀不算。
  • 证据:aida-agent · fixtures/desktop-contract/work-attention-v1.json L1–23 · work-attention-v1 · e2adc9a3c325;aida-agent · fixtures/desktop-contract/README.md L5–8 · work-attention-v1.json · e2adc9a3c325;aida-agent · packages/agent/src/gateway/chat-routes.ts L172–180 · observationErrorRetryable · e2adc9a3c325;aida-agent · packages/agent/src/gateway/chat-routes.ts L1298–1304 · observationErrorRetryable · e2adc9a3c325;aida-agent · packages/agent/src/config/services/pack-release-gate.ts L1–12 · readyz · e2adc9a3c325;aida-agent · packages/agent/src/config/services/pack-release-gate.ts L130–153 · checkAllTenantPacks · e2adc9a3c325;aida-desktop · apps/desktop/electron/agent-loop/runtime-execution-client.ts L73–98 · messageAdmissionRejectionSchema · 4346d79eb364;aida-desktop · apps/desktop/shared/runtime-work-admission-rejection.ts L3–18 · RUNTIME_WORK_MESSAGE_TOO_LONG · 4346d79eb364

readyz:工具契约漂移(2026-10-14 钉点)

ToolContractMonitor 在启动与周期性比对代码声明的后端工具需求与后端 listTools 实际清单;钉点 e2adc9a3c325 起还用进程已加载的工具 schema 比对参数契约(TOOL_ARGUMENT_CONTRACTS:Agent 会发而后端没有的参数、后端必填而 Agent 不发的参数,只报会导致调用失败的差异;未配置后端的域跳过)。结果以 toolContracts(missing + argumentDrift)出现在 readyz;任一漂移只把状态置 degraded、readyz 仍为 200;任一漂移集合变化时发高严重度审计与错误日志,用户指引标注“暂不可用”。

视图

  • main — 诊断码 → 产出面 → DB/本机落点 → 排障入口。
  • runs-stream — 只读 GET /api/runs/:runId/stream:鉴权、账本重放、增量轮询与中断收尾。

归属边与非目标

  • Owner:各码的产出模块(Gateway / UnifiedEntry / PluginHost / Main / Boot)。
  • 非目标:不替代完整错误码表(见 desktop-runtime);不做日志平台接入设计。
  • 相关:enterprise-task-e2e、state-authority、storage-planes、vertical-plugin-mount、trust-boundaries、time-bounds。

证据与范围

  • aida-agent · packages/agent/src/gateway/chat-routes.ts L520–524 · desktopPayloadVersionUnsupported · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/api-conversation-interactions.ts L465–495 · interaction_protocol_upgrade_required · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/chat-routes.ts L381–421 · RUNTIME_EXECUTION_PROTOCOL_UNSUPPORTED · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/unified-entry.ts L2660–2682 · RUN_LEASE_LOST · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/unified-entry.ts L1948–1978 · RUN_LEASE_BUSY · e2adc9a3c325
  • aida-desktop · apps/desktop/electron/local-files-v4/write-state-persistence.ts L730–746 · LOCAL_FILE_WRITE_STATE_LEGACY_DROPPED · 4346d79eb364
  • aida-agent · packages/agent/src/config/schema-identity.ts L661–701 · assertCurrentConfigSchema · e2adc9a3c325
  • aida-agent · packages/agent/src/connectors/tool-contract-monitor.ts L1–16 · readyz · e2adc9a3c325
  • aida-agent · packages/agent/src/connectors/tool-contract-monitor.ts L229–251 · argumentDrift · e2adc9a3c325
  • aida-agent · packages/agent/src/connectors/tool-argument-contracts.ts L192–219 · evaluateToolArgumentContracts · e2adc9a3c325

结论来自固定版本的静态源码与合同阅读;实现存在、默认开关和生产启用分别判断。本站代码证据面板列出声明状态与具体限制。

  • aida-agent · packages/agent/src/gateway/chat-work-sse-response.ts L27–41 · projectRouteDecisionEvent · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/chat-work-sse-response.ts L127–132 · SERVER_DRAINING · e2adc9a3c325
  • aida-agent · packages/agent/src/runtime/execution/run-execution-storage.ts L952–968 · decideOwnerLostRecovery · e2adc9a3c325
  • aida-desktop · apps/desktop/src/chat/core/runTimeline.ts L444–453 · run_recovering · 4346d79eb364

Desktop 轨迹采集更新(2026-10-29)

Main captureIdentity 要求 isDeveloper() 与 isPanelVisible() 同时成立;prepareSubmission 以 clientRequestId 去重并限制诊断等待,诊断失败不创造 Run 失败。invalidate 增加 epoch、清除当前采集身份并停止交付。证据:aida-desktop · apps/desktop/electron/trajectory/desktop-trajectory-controller.ts L100–105 / L81–134 · 4346d79eb364。这是代码静态复核,不代表真机采集验收。

Runtime 提交 wire 与原 Work identity

chat POST 的 Runtime 提交门接受缺省/空值(无 policy)、runtime-work-v1(无 policy),以及 runtime-work-skill-v2 且携带合法 skillExecutionPolicy;其他非空头为 RUNTIME_EXECUTION_PROTOCOL_UNSUPPORTED,头与 policy 不匹配为 RUNTIME_WORK_SKILL_POLICY_MISMATCH,均返回 426。原 Work binding 仍是 runtime-work-v1;取消提交、补充材料等路由单独判定,见协议地图。

证据:提交门 与 实际 chat POST 调用。

代码证据

引用核验检查固定 commit 的文件与范围;实现结论来自代码阅读。自动检查不证明生产环境已启用。

已核验实现

Desktop 协议不是 3(请求头有值且≠3,或 localExecutor.version≠3),或没带协议头却携带本机执行载荷时,chat-routes 以 426 DESKTOP_UPGRADE_REQUIRED 阻断整次提交,不创建 agent_runs;原 LOCAL_FILE_PROTOCOL_UPGRADE_REQUIRED 错误码已删除。

aida-agentpackages/agent/src/gateway/chat-routes.ts:326–3647f2e519936b57902d4907ed8026fe1ecdd146e82符号:DESKTOP_UPGRADE_REQUIRED_BODY
aida-agentpackages/agent/src/gateway/chat-routes.ts:608–6127f2e519936b57902d4907ed8026fe1ecdd146e82符号:desktopPayloadVersionUnsupported
aida-agentpackages/agent/src/gateway/chat-routes.ts:509–5127f2e519936b57902d4907ed8026fe1ecdd146e82符号:chatBodyCarriesLocalExecution
已核验实现

api-conversation-interactions 中间件在协议头未接受时返回 426 interaction_protocol_upgrade_required,不进入 Kernel。

aida-agentpackages/agent/src/gateway/api-conversation-interactions.ts:369–3997f2e519936b57902d4907ed8026fe1ecdd146e82符号:interaction_protocol_upgrade_required
已核验实现

chat POST 的 Runtime 提交门接受缺省/空值(无 policy)、runtime-work-v1(无 policy),以及 runtime-work-skill-v2 且携带合法 skillExecutionPolicy;其他非空头为 RUNTIME_EXECUTION_PROTOCOL_UNSUPPORTED,头与 policy 不匹配为 RUNTIME_WORK_SKILL_POLICY_MISMATCH,均返回 426。原 Work binding 仍是 runtime-work-v1;取消提交、补充材料等路由单独判定,见协议地图。

aida-agentpackages/agent/src/gateway/chat-work-admission.ts:15–247f2e519936b57902d4907ed8026fe1ecdd146e82符号:runtimeWorkSubmissionProtocol
aida-agentpackages/agent/src/gateway/chat-routes.ts:531–5357f2e519936b57902d4907ed8026fe1ecdd146e82符号:submissionProtocol
已核验实现

UnifiedEntry 在 RunLeaseLostError 时向客户端产出 retryable RUN_LEASE_LOST,并可写入 run 失败码。

aida-agentpackages/agent/src/gateway/unified-entry.ts:2903–29257f2e519936b57902d4907ed8026fe1ecdd146e82符号:RUN_LEASE_LOST
已核验实现

UnifiedEntry 在 acquireLease 失败时产出 RUN_LEASE_BUSY。

aida-agentpackages/agent/src/gateway/unified-entry.ts:2167–21977f2e519936b57902d4907ed8026fe1ecdd146e82符号:RUN_LEASE_BUSY
已核验实现

LocalFileWriteStatePersistence 解析加密 write-state 信封时,若有 legacy 条目被丢弃,经 diagnostic 上报 LOCAL_FILE_WRITE_STATE_LEGACY_DROPPED。

aida-desktopapps/desktop/electron/local-files-v4/write-state-persistence.ts:860–8764346d79eb36402355e51118df0edf1f98586880c符号:LOCAL_FILE_WRITE_STATE_LEGACY_DROPPED
已核验实现

assertCurrentConfigSchema 在 schema_id 不匹配时 throw,进程 fail-fast;落点为 config_schema_identity。identity 匹配后还要求 messages 是普通表(relkind=r,否则提示先执行 181),再查必需关系 / 列 / 守卫。

aida-agentpackages/agent/src/config/schema-identity.ts:720–7607f2e519936b57902d4907ed8026fe1ecdd146e82符号:assertCurrentConfigSchema
已核验实现

Work SSE 观察转发 capability_route_decision 的脱敏投影:仅 status + 已选能力(primaryCapabilityId 及其置信信号;refused 时为空),不下发其它候选、原话或抽取槽位;并按 id 去重转发 run_recovering。

aida-agentpackages/agent/src/gateway/chat-work-sse-response.ts:45–597f2e519936b57902d4907ed8026fe1ecdd146e82符号:projectRouteDecisionEvent
aida-agentpackages/agent/src/gateway/chat-work-sse-response.ts:202–2277f2e519936b57902d4907ed8026fe1ecdd146e82符号:run_recovering
已核验实现

实例下线:排空信号触发时 SSE 发 run_recovering(reasonCode SERVER_DRAINING)后正常结束;租约丢失/中断的 Run 由 decideOwnerLostRecovery 处置——未产生写入提案/来源写入且未发布回复的轮次回到 pending 重新领取(有次数上限),已写入或超限的转 manual_recovery(*_AFTER_WRITE)。

aida-agentpackages/agent/src/gateway/chat-work-sse-response.ts:204–2097f2e519936b57902d4907ed8026fe1ecdd146e82符号:SERVER_DRAINING
aida-agentpackages/agent/src/runtime/execution/run-execution-storage.ts:1009–10257f2e519936b57902d4907ed8026fe1ecdd146e82符号:decideOwnerLostRecovery
aida-agentpackages/agent/src/runtime/execution/run-execution-storage.ts:918–9397f2e519936b57902d4907ed8026fe1ecdd146e82符号:manual_recovery
aida-agentpackages/agent/src/runtime/lifecycle/stream-drain.ts:1–67f2e519936b57902d4907ed8026fe1ecdd146e82符号:run_recovering
已核验实现

工具契约漂移检测(ToolContractMonitor):启动与周期性比对代码声明的后端工具需求与后端实际 listTools,并用进程已加载的工具 schema 比对参数契约(TOOL_ARGUMENT_CONTRACTS:Agent 会发但后端 schema 没有的参数 unknownArgs、后端必填但 Agent 不发的参数 missingRequired;未配置后端的域跳过);结果以 toolContracts(含 missing 与 argumentDrift)出现在 readyz,任一漂移只把状态置 degraded、readyz 仍为 200;任一漂移集合变化时发高严重度审计与错误日志,用户指引标注暂不可用。

aida-agentpackages/agent/src/connectors/tool-contract-monitor.ts:1–167f2e519936b57902d4907ed8026fe1ecdd146e82符号:readyz
aida-agentpackages/agent/src/gateway/http.ts:858–8647f2e519936b57902d4907ed8026fe1ecdd146e82符号:toolContracts
aida-agentpackages/agent/src/connectors/tool-contract-monitor.ts:266–2887f2e519936b57902d4907ed8026fe1ecdd146e82符号:argumentDrift
aida-agentpackages/agent/src/connectors/tool-argument-contracts.ts:192–2197f2e519936b57902d4907ed8026fe1ecdd146e82符号:evaluateToolArgumentContracts
已核验实现

Desktop 收到 run_recovering 时把任务状态置为 active / processing,显示「续跑中…」,并给 60 秒权威窗口;不改服务端 Run 状态。

aida-desktopapps/desktop/src/chat/core/runTimeline.ts:487–4964346d79eb36402355e51118df0edf1f98586880c符号:run_recovering
已核验实现

只读 AI SDK Run 消息流:GET /api/runs/:runId/stream 复用拥有者可见性鉴权,从既有 chat_sse 账本按序号整条重放(runUIMessageStream);POST /api/runs 与非 GET 的 /:runId/stream 一律 405 UI_MESSAGE_READ_ONLY(拒绝 SDK 自动审批回写,不推进执行);账本不可用 503 UI_MESSAGE_LEDGER_UNAVAILABLE。流内每轮先重新鉴权(会话或租户变了即中断),按 cursor listAfter 增量读取、空批时 250ms 轮询;最长 300s(sseMaxDurationMs)、重放事件数 / 字节有上限,中断时补写 interruption 帧再 [DONE];首读为空或账本不完整返回 409,不把丢失历史当空回复。

aida-agentpackages/agent/src/gateway/api-runs.ts:155–2107f2e519936b57902d4907ed8026fe1ecdd146e82符号:runUIMessageStream
aida-agentpackages/agent/src/gateway/run-ui-message-stream.ts:1–207f2e519936b57902d4907ed8026fe1ecdd146e82
aida-agentpackages/agent/src/gateway/run-ui-message-stream.ts:35–2217f2e519936b57902d4907ed8026fe1ecdd146e82符号:runUIMessageStream
已核验实现

Desktop 诊断轨迹交付(agent 984574a6f / desktop da4fb523):Agent 只在 chat 角色且配置了 schedulerRedisUrl、Redis 可连通时启用 RedisDesktopTrajectoryDelivery,作为有界临时传输(默认 TTL 300s、8 MiB、10000 事件、每主体 8 个会话),连不上就 CAPTURE_DISABLED;路由 /api/trajectory-delivery 要求带 localExecutionScope 的 Desktop 身份(否则 403 CAPTURE_DESKTOP_IDENTITY_REQUIRED),POST /sessions 开会话、GET /:captureId/stream 以 SSE 拉帧。持久归档归 Desktop Main:DesktopTrajectoryStore 是唯一持久事件日志(默认 32 MiB),由 Main 的 developer 模式与轨迹面板偏好共同控制的 DesktopTrajectoryController 在新提交时自动准备;无独立 start-capture 控件/IPC,诊断握手最多等待 2 秒,epoch/身份失效停止采集,不保存凭证、不授予业务或恢复权限。

aida-agentpackages/agent/src/index.ts:2464–24907f2e519936b57902d4907ed8026fe1ecdd146e82符号:RedisDesktopTrajectoryDelivery
aida-agentpackages/agent/src/trajectory/desktop-delivery.ts:335–3607f2e519936b57902d4907ed8026fe1ecdd146e82符号:maxSessionsPerPrincipal
aida-agentpackages/agent/src/gateway/api-trajectory-delivery.ts:33–467f2e519936b57902d4907ed8026fe1ecdd146e82符号:CAPTURE_DESKTOP_IDENTITY_REQUIRED
aida-agentpackages/agent/src/gateway/api-trajectory-delivery.ts:66–1057f2e519936b57902d4907ed8026fe1ecdd146e82符号:/sessions
aida-agentpackages/agent/src/gateway/http.ts:1944–19447f2e519936b57902d4907ed8026fe1ecdd146e82符号:/api/trajectory-delivery
aida-desktopapps/desktop/electron/trajectory/desktop-trajectory-store.ts:40–804346d79eb36402355e51118df0edf1f98586880c符号:DesktopTrajectoryStore
aida-desktopapps/desktop/electron/trajectory/desktop-trajectory-controller.ts:124–1294346d79eb36402355e51118df0edf1f98586880c符号:isPanelVisible
aida-desktopapps/desktop/electron/trajectory/desktop-trajectory-controller.ts:114–1664346d79eb36402355e51118df0edf1f98586880c符号:prepareSubmission
已核验实现

超长消息的未受理回执(agent 547ae8ae2):chat POST 在建会话、受理任务之前检查 maxMessageLength,超长返回 400 并审计 message_too_long;Runtime Work 请求另带 code RUNTIME_WORK_MESSAGE_TOO_LONG 与 chatAdmission{status:rejected, maxMessageLength, recoveryAction},Desktop 可保留草稿重发。

aida-agentpackages/agent/src/gateway/chat-routes.ts:583–6017f2e519936b57902d4907ed8026fe1ecdd146e82符号:RUNTIME_WORK_MESSAGE_TOO_LONG
已核验实现

运行时指标基线(STA-33 MR1,9ed5e3fbc):接入现有 /metrics 的 Prometheus 指标,标签都是有限枚举、不含租户 / 用户 / 会话 / run id——chat 受理结果(accepted / duplicate / not_started{reason} / rejected{status} / unavailable / reply_replayed,只在明确受理决定处记一次)、按 quota_bucket 的排队时长、LLM_BUSY 计数与 LLM 排队等待、首次公开正文发布耗时、reply_user 与兜底发布计数、Worker 名额。记录经 safelyRecordRuntimeMetric 包装,失败只记日志、不改业务结果;Desktop 本地拦截不在其内。

aida-agentpackages/agent/src/observability/runtime-metrics.ts:90–1427f2e519936b57902d4907ed8026fe1ecdd146e82符号:recordChatAdmission
aida-agentpackages/agent/src/gateway/chat-routes.ts:468–4837f2e519936b57902d4907ed8026fe1ecdd146e82符号:safelyRecordRuntimeMetric
aida-agentpackages/agent/src/runtime/execution/run-execution-storage.ts:503–5067f2e519936b57902d4907ed8026fe1ecdd146e82符号:recordRunQueueWait
已核验实现

个人待办快照 GET /api/work/attention(ADR-0095 MR3,ba37f6827):只读、轮询优先,返回当前用户的前台 Work / 后台 Work / 业务事项 / 待办卡条目(state:running / queued / waiting / needs_action / terminal);身份只取 /api/* JWT → TenantContext,会话须本人所有且未删除,卡片还要过 Kernel actor policy;整次读取在只读 repeatable-read 与 5 秒期限内,候选各限 1000、最近结束限 24 小时 / 100 项;游标以 JWT secret 做 HMAC、5 分钟有效,可见集合变化返回 409 ATTENTION_SNAPSHOT_CHANGED。stop 动作只给可停止的前台 Work root,实际停止仍走 POST /api/runs/:runId/work-stop 重新鉴权。runtime-capabilities 增加 attention { apiVersion: 1, polling: true, enabled }。

aida-agentpackages/agent/src/gateway/api-work-attention.ts:10–247f2e519936b57902d4907ed8026fe1ecdd146e82符号:/attention
aida-agentpackages/agent/src/gateway/work-attention.ts:74–767f2e519936b57902d4907ed8026fe1ecdd146e82符号:ATTENTION_CANDIDATE_LIMIT
aida-agentpackages/agent/src/gateway/work-attention.ts:153–1597f2e519936b57902d4907ed8026fe1ecdd146e82符号:5000
aida-agentpackages/agent/src/gateway/http.ts:1990–19927f2e519936b57902d4907ed8026fe1ecdd146e82符号:createApiWorkAttentionRouter
aida-agentpackages/agent/src/gateway/chat-routes.ts:252–2567f2e519936b57902d4907ed8026fe1ecdd146e82符号:attention
aida-agentdocs/adr/0095-conversation-seq-quota-bucket-background-write.md:164–1697f2e519936b57902d4907ed8026fe1ecdd146e82符号:/api/work/attention
已核验实现

Stop 必须指向明确 root run id(ADR-0095 2a-2):POST /api/runs/:runId/work-stop 只停该原工作(要求 X-AIDA-Runtime-Protocol=runtime-work-v1 与 Idempotency-Key 承载 stop command id),GET 同路径只查该命令的受理事实;不存在会话级批量 Stop。getActiveByConversation、终态 attach fallback 与受理的前台占用查询都排除 background_work.v1 / background 桶,后台行不会成为隐式 Stop 目标;只读 listBackgroundByConversation 另供后台 root 最小信息。

aida-agentpackages/agent/src/gateway/api-runs.ts:257–2917f2e519936b57902d4907ed8026fe1ecdd146e82符号:work-stop
aida-agentpackages/agent/src/session/run-store.ts:1901–19367f2e519936b57902d4907ed8026fe1ecdd146e82符号:listBackgroundByConversation
aida-agentdocs/adr/0095-conversation-seq-quota-bucket-background-write.md:154–1617f2e519936b57902d4907ed8026fe1ecdd146e82符号:work-stop
已核验实现

work-attention-v1 跨仓合同 fixture:fixtures/desktop-contract/work-attention-v1.json 由 aida-agent 拥有,定义 GET /api/work/attention 的字段、示例与反例(apiVersion 1 轮询快照、无 SSE 补读;kind / state 枚举;HMAC 游标 5 分钟、变化 409;stop 只在可控前台 root 上并带 rootRunId;readWindow 截断说明),由 Agent 合同测试按生产响应 schema 校验;README 写明 Desktop 消费 / 镜像与 SSE 补读是后续工作。

aida-agentfixtures/desktop-contract/work-attention-v1.json:1–237f2e519936b57902d4907ed8026fe1ecdd146e82符号:work-attention-v1
aida-agentfixtures/desktop-contract/README.md:5–87f2e519936b57902d4907ed8026fe1ecdd146e82符号:work-attention-v1.json
已核验实现

Work 观察读取超时可重试(89c9bdad3):chat 流在观察原 Work 出错时写 error 事件,只有 RUNTIME_WORK_READ_TIMEOUT 标为 retryable=true(读预算耗尽不代表 run 失败,run 继续执行,客户端可重新观察);绑定 / 授权失败仍 retryable=false。

aida-agentpackages/agent/src/gateway/chat-routes.ts:15–237f2e519936b57902d4907ed8026fe1ecdd146e82符号:observationErrorRetryable
aida-agentpackages/agent/src/gateway/chat-routes.ts:1800–18067f2e519936b57902d4907ed8026fe1ecdd146e82符号:observationErrorRetryable
已核验实现

Pack 发布门(D7 release gate):同一检查在部署前(scripts/pack-release-gate.ts,exit 1 阻断发布)、服务内 readyz packs(后台刷新)和部署后逐租户冒烟运行;1d07cf06a 起默认扫描与显式目标都包含没有订阅行、隐式跟随默认 Pack 的租户;单个租户失败只把 readyz 标为 degraded,全部失败为 unavailable,读不到订阅为 unreachable。

aida-agentpackages/agent/src/config/services/pack-release-gate.ts:1–127f2e519936b57902d4907ed8026fe1ecdd146e82符号:readyz
aida-agentpackages/agent/src/config/services/pack-release-gate.ts:167–1907f2e519936b57902d4907ed8026fe1ecdd146e82符号:checkAllTenantPacks
已核验实现

Desktop 消费 RUNTIME_WORK_MESSAGE_TOO_LONG(9fdc200c):Main 的 runtime-execution-client 对 400 只在响应体符合 messageAdmissionRejectionSchema(code 与 chatAdmission.code 都是 RUNTIME_WORK_MESSAGE_TOO_LONG、带 maxMessageLength 与 recoveryAction)且本条消息确实超过 maxMessageLength 时,才生成绑定原 POST(clientRequestId、requestDigest)的拒绝回执;仅凭 HTTP 状态或错误码前缀不算拒绝回执,其余 400/409 抛传输错误。

aida-desktopapps/desktop/shared/runtime-work-admission-rejection.ts:32–514346d79eb36402355e51118df0edf1f98586880c符号:messageAdmissionRejectionSchema
aida-desktopapps/desktop/electron/agent-loop/runtime-work-submission-client.ts:89–944346d79eb36402355e51118df0edf1f98586880c符号:messageAdmissionRejectionSchema
aida-desktopapps/desktop/shared/runtime-work-admission-rejection.ts:16–314346d79eb36402355e51118df0edf1f98586880c符号:RUNTIME_WORK_MESSAGE_TOO_LONG