AIDAWORK / ARCHITECTURE

多实例:共享状态与执行租约

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

启动要求 CONFIG_DB_URL 和 CONFIG_ENC_KEY,缺失时失败;InMemory 不再是这条生产启动路径的回退。数据库共享并不自动把所有进程内控制合成一个全局控制面。

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

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

机制说明(全文)

多实例:共享状态与执行租约

持久化共享与进程内状态

启动要求 CONFIG_DB_URL 和 CONFIG_ENC_KEY,缺失时失败;InMemory 不再是这条生产启动路径的回退。数据库共享并不自动把所有进程内控制合成一个全局控制面。

文本 RunExecutionWorker 在 chat role 装配,Worker 这个职责名不表示独立部署角色。租户 RPM/RPD:配置 Redis(rateLimitRedisUrl)时跨实例共享计数、出错退回进程内;未配置时为进程内 Map,多实例分别计数。限额按租户覆盖 → 档位 → 全局默认解析。图表达代码的部署约束,没有推断实际线上副本数、Redis 配置或容量。

租户公平与背压(2026-10-14 钉点)

  • Run 领取按配额桶(钉点 e2adc9a3c325,ADR-0095 MR5):计数单位是不可变的 agent_runs.quota_bucket(推导规则见 storage-planes)。foreground(会话顶层 turn)沿用单语句软上限(standard 2 / plus 4 / dedicated 8,可被租户覆盖;并发领取可短暂超出),前台 running 少的租户优先;uncounted(前台 child、scheduled、business task 等)不计不限,以免父等子死锁;只有 background 是硬上限(内置 1 / 2 / 4):候选行 SKIP LOCKED 后取 (execution_scope, tenant, background) 的 pg_try_advisory_xact_lock,拿不到就跳过,再用独立语句复核 running 数。无 fairness 配置时前台 FIFO 不限,后台仍按 standard=1。实例级另有 RUN_EXECUTION_BACKGROUND_CONCURRENCY(默认 1,0 禁用后台)。见视图 quota-claim。
  • 后台生产者已合入(STA-33 MR6-B/C/D,默认关):MR6-A 合同仍在;B 执行与控制循环、C 模板报告/通知/队列原因、D 租户门控生产者。BACKGROUND_WORK_TENANT_POLICIES 按租户 enabled / biEnabled / longRunningCapabilityIds(未配置=关,只能收窄内置 8 能力白名单)。开启后前台忙或长跑能力时,只读 routed 查询可原子受理为已完成的 conversation_turn 交接 + background_work.v1 root(回复「已收到,在后台处理。」);每会话最多 3 个活跃后台 root;本机执行/附件/插件/本地执行器永不进后台;BI 需 biEnabled。迁移 186 为未完成后台 root 建部分索引。
  • 租户资源档位表只有迁移草案(docs/migration-drafts/tenant-resource-tiers-DRAFT.sql),解析器用 to_regclass 探测,表不存在时一律用内置 standard 档;档位维护仅平台超级管理员。租户角色模型(tenant-role-model.ts)目前只有纯函数与测试,未接入运行时;它的迁移原拟 170,现预留为 172(尚未提交、尚未执行;两份草案仍写 170,见 storage-planes)。
  • 配置变更经 pg_notify(aida_config_changed) 跨实例失效;广播失败只告警,其他实例按缓存 TTL 收敛。
  • 模型调用经 ProviderLimiter(默认在途 16、排队 64、等待 30s,LLM_PROVIDER_* 可调),排队满或超时返回 LLM_BUSY 背压。钉点 e2adc9a3c325 起排队按前台 / 后台两类各计上限、出队前台优先(桶取自 ALS runQuotaBucket),后台即使部署关掉等待超时也保留默认期限。

后台工作合同与工具策略(MR6-A,d3b4881b1,钉点 e2adc9a3c325)

  • 命令合同:BackgroundWorkCommand(background_work.v1)进入共享 run 命令 union。payload 严格冻结 origin run / invocation、命令与请求摘要、输入消息边界、已接受路由、capability 指纹,effectCeiling=read_only、writeToolsAllowed=false,预算 600s、deadline 恰为受理后 2 小时;sourceFactRef = idempotencyKey = background-work:<originRunId>。createBackgroundWorkCommand 只做纯构造。

  • 工具交集规则:capability 白名单(hr / recruit / vms 查询类、onboarding 问答、analytics.bi_query)→ 显式读工具列表 ∩ 当前已授权 Skill 声明 ∩ 已挂载的只读、风险 allow、租户可用、非插件、无需确认的工具,再排除 reply_user / askUser / collectStructuredInput / request_file_access / confirm / request_confirmation / runSkillScript。BI 默认关:analytics.bi_query 只有显式 biBackgroundEnabled=true 才有工具。已冻结的策略只能再收窄,摘要不符 BACKGROUND_TOOL_POLICY_INVALID。

  • 读侧:Work 视图新增 workKind: 'background_work.v1',带它的视图不能有 pendingFileRequest / carrierBinding / publicProcess;执行快照按 run_kind 分到 loadBackgroundWorkExecutionSnapshot。

  • 生产者接线(本钉点):ChatSubmissionStore 在租户 enabled 且无本机/插件绑定时调用 eligibleBackgroundRoute → admitBackgroundWorkInTx(见视图 bg-admit)。createBackgroundWorkCommand / computeBackgroundToolPolicy 由受理路径构造;默认关时生产流量仍走旧前台路径。

  • MR6 状态(本钉点):MR6-B/C/D 已合入 master;生产者默认关,需配置 BACKGROUND_WORK_TENANT_POLICIES。

  • 档位草案:tenant-resource-tiers-DRAFT.sql 增加 max_concurrent_background_runs(1–64,租户覆盖可空);草案未执行时用内置档位 1 / 2 / 4。

  • 档位草案执行状态:发版顺序文档(2026-10-14)记为「未执行」,之后没有执行记录(migrations/README 与 202 执行记录都没有);库内实际状态读不到。证据:aida-agent · docs/release/rollback-and-release-order.md L29 · tenant-resource-tiers · e2adc9a3c325

  • 证据:aida-agent · packages/tool-client/src/types/runtime-v2.ts L64–89 · background_work.v1 · e2adc9a3c325;aida-agent · packages/tool-client/src/types/runtime-v2.ts L204–218 · background-work: · e2adc9a3c325;aida-agent · packages/tool-client/src/types/runtime-v2.ts L232–247 · createBackgroundWorkCommand · e2adc9a3c325;aida-agent · packages/agent/src/runtime/work/background-work-policy.ts L7–47 · analytics.bi_query · e2adc9a3c325;aida-agent · packages/agent/src/runtime/work/background-work-policy.ts L60–68 · runSkillScript · e2adc9a3c325;aida-agent · packages/agent/src/runtime/work/background-work-policy.ts L115–173 · computeBackgroundToolPolicy · e2adc9a3c325;aida-agent · packages/tool-client/src/types/runtime-execution.ts L272–301 · workKind · e2adc9a3c325;aida-agent · packages/agent/src/runtime/work/run-work-execution-snapshot.ts L38–42 · loadBackgroundWorkExecutionSnapshot · e2adc9a3c325;aida-agent · docs/migration-drafts/tenant-resource-tiers-DRAFT.sql L10–14 · max_concurrent_background_runs · e2adc9a3c325;aida-agent · docs/migration-drafts/tenant-resource-tiers-DRAFT.sql L36–40 · max_concurrent_background_runs · e2adc9a3c325

证据与范围

  • aida-agent · packages/agent/src/index.ts L1092–1112 · test-only · e2adc9a3c325
  • aida-agent · packages/agent/src/index.ts L2433–2443 · executionWorker.start · e2adc9a3c325
  • aida-agent · packages/agent/src/runtime/execution/run-execution-worker.ts L69–70 · RunExecutionWorker · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/quota.ts L37–67 · TenantRateLimiter · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/redis-tenant-rate-limiter.ts L137–170 · createTenantRateLimiter · e2adc9a3c325
  • aida-agent · packages/agent/src/runtime/execution/run-claim-quota.ts L78–86 · tryReserveTenantRunSlot · e2adc9a3c325
  • aida-agent · packages/agent/src/runtime/execution/run-execution-storage.ts L531–541 · quota_bucket <> 'background' · e2adc9a3c325
  • aida-agent · packages/agent/src/runtime/execution/run-execution-worker.ts L403–415 · RUN_EXECUTION_BACKGROUND_CONCURRENCY · e2adc9a3c325
  • aida-agent · packages/agent/src/tenant/resource-policy.ts L369–413 · to_regclass · e2adc9a3c325
  • aida-agent · packages/agent/src/config/config-change-bus.ts L54–64 · publishConfigChange · e2adc9a3c325
  • aida-agent · packages/agent/src/llm/provider-limiter.ts L12–44 · LLM_BUSY · e2adc9a3c325

视图

  • main — 多实例共享状态与执行租约。
  • quota-claim — 一次领取怎样按配额桶判定(前台软上限 / 后台硬上限 / uncounted 不限)。

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

  • 本轮生产者证据:aida-agent · packages/agent/src/shared/background-work-tenant-policy.ts L3–20 · BACKGROUND_CAPABILITY_IDS · e2adc9a3c325;aida-agent · packages/agent/src/runtime/work/background-work-admission.ts L159–188 · admitBackgroundWorkInTx · e2adc9a3c325;aida-agent · packages/agent/migrations/186_background_open_roots_index.sql L56–70 · idx_agent_runs_background_open_roots · e2adc9a3c325

产品口径旁挂(非本页机制)

本主题讲多实例共享状态、租户配额桶与后台生产者——不是 MSP 的产品定义。MSP = 原中台算薪运维等能力入产品(≠单纯多租户),见 product-narrative(2026-10-29)。

LLM Credits(钉点 e2adc9a3c325)

  • 迁移 187 引入租户/用户 Credits 表与 identity …-llm-credits。
  • Gateway admitChatCredits / creditsExhaustedResponse 在 chat 受理路径扣减/拒绝。
  • 与 ADR-0095 配额桶正交:Credits 是 LLM 用量账,quota_bucket 是 Run 领取桶。生产开通与共享库执行 未核实。

机制说明

多实例:共享状态与执行租约

持久化共享与进程内状态

启动要求 CONFIG_DB_URL 和 CONFIG_ENC_KEY,缺失时失败;InMemory 不再是这条生产启动路径的回退。数据库共享并不自动把所有进程内控制合成一个全局控制面。

文本 RunExecutionWorker 在 chat role 装配,Worker 这个职责名不表示独立部署角色。租户 RPM/RPD:配置 Redis(rateLimitRedisUrl)时跨实例共享计数、出错退回进程内;未配置时为进程内 Map,多实例分别计数。限额按租户覆盖 → 档位 → 全局默认解析。图表达代码的部署约束,没有推断实际线上副本数、Redis 配置或容量。

租户公平与背压(2026-10-14 钉点)

  • Run 领取按配额桶(钉点 e2adc9a3c325,ADR-0095 MR5):计数单位是不可变的 agent_runs.quota_bucket(推导规则见 storage-planes)。foreground(会话顶层 turn)沿用单语句软上限(standard 2 / plus 4 / dedicated 8,可被租户覆盖;并发领取可短暂超出),前台 running 少的租户优先;uncounted(前台 child、scheduled、business task 等)不计不限,以免父等子死锁;只有 background 是硬上限(内置 1 / 2 / 4):候选行 SKIP LOCKED 后取 (execution_scope, tenant, background) 的 pg_try_advisory_xact_lock,拿不到就跳过,再用独立语句复核 running 数。无 fairness 配置时前台 FIFO 不限,后台仍按 standard=1。实例级另有 RUN_EXECUTION_BACKGROUND_CONCURRENCY(默认 1,0 禁用后台)。见视图 quota-claim。
  • 后台生产者已合入(STA-33 MR6-B/C/D,默认关):MR6-A 合同仍在;B 执行与控制循环、C 模板报告/通知/队列原因、D 租户门控生产者。BACKGROUND_WORK_TENANT_POLICIES 按租户 enabled / biEnabled / longRunningCapabilityIds(未配置=关,只能收窄内置 8 能力白名单)。开启后前台忙或长跑能力时,只读 routed 查询可原子受理为已完成的 conversation_turn 交接 + background_work.v1 root(回复「已收到,在后台处理。」);每会话最多 3 个活跃后台 root;本机执行/附件/插件/本地执行器永不进后台;BI 需 biEnabled。迁移 186 为未完成后台 root 建部分索引。
  • 租户资源档位表只有迁移草案(docs/migration-drafts/tenant-resource-tiers-DRAFT.sql),解析器用 to_regclass 探测,表不存在时一律用内置 standard 档;档位维护仅平台超级管理员。租户角色模型(tenant-role-model.ts)目前只有纯函数与测试,未接入运行时;它的迁移原拟 170,现预留为 172(尚未提交、尚未执行;两份草案仍写 170,见 storage-planes)。
  • 配置变更经 pg_notify(aida_config_changed) 跨实例失效;广播失败只告警,其他实例按缓存 TTL 收敛。
  • 模型调用经 ProviderLimiter(默认在途 16、排队 64、等待 30s,LLM_PROVIDER_* 可调),排队满或超时返回 LLM_BUSY 背压。钉点 e2adc9a3c325 起排队按前台 / 后台两类各计上限、出队前台优先(桶取自 ALS runQuotaBucket),后台即使部署关掉等待超时也保留默认期限。

后台工作合同与工具策略(MR6-A,d3b4881b1,钉点 e2adc9a3c325)

  • 命令合同:BackgroundWorkCommand(background_work.v1)进入共享 run 命令 union。payload 严格冻结 origin run / invocation、命令与请求摘要、输入消息边界、已接受路由、capability 指纹,effectCeiling=read_only、writeToolsAllowed=false,预算 600s、deadline 恰为受理后 2 小时;sourceFactRef = idempotencyKey = background-work:<originRunId>。createBackgroundWorkCommand 只做纯构造。

  • 工具交集规则:capability 白名单(hr / recruit / vms 查询类、onboarding 问答、analytics.bi_query)→ 显式读工具列表 ∩ 当前已授权 Skill 声明 ∩ 已挂载的只读、风险 allow、租户可用、非插件、无需确认的工具,再排除 reply_user / askUser / collectStructuredInput / request_file_access / confirm / request_confirmation / runSkillScript。BI 默认关:analytics.bi_query 只有显式 biBackgroundEnabled=true 才有工具。已冻结的策略只能再收窄,摘要不符 BACKGROUND_TOOL_POLICY_INVALID。

  • 读侧:Work 视图新增 workKind: 'background_work.v1',带它的视图不能有 pendingFileRequest / carrierBinding / publicProcess;执行快照按 run_kind 分到 loadBackgroundWorkExecutionSnapshot。

  • 生产者接线(本钉点):ChatSubmissionStore 在租户 enabled 且无本机/插件绑定时调用 eligibleBackgroundRoute → admitBackgroundWorkInTx(见视图 bg-admit)。createBackgroundWorkCommand / computeBackgroundToolPolicy 由受理路径构造;默认关时生产流量仍走旧前台路径。

  • MR6 状态(本钉点):MR6-B/C/D 已合入 master;生产者默认关,需配置 BACKGROUND_WORK_TENANT_POLICIES。

  • 档位草案:tenant-resource-tiers-DRAFT.sql 增加 max_concurrent_background_runs(1–64,租户覆盖可空);草案未执行时用内置档位 1 / 2 / 4。

  • 档位草案执行状态:发版顺序文档(2026-10-14)记为「未执行」,之后没有执行记录(migrations/README 与 202 执行记录都没有);库内实际状态读不到。证据:aida-agent · docs/release/rollback-and-release-order.md L29 · tenant-resource-tiers · e2adc9a3c325

  • 证据:aida-agent · packages/tool-client/src/types/runtime-v2.ts L64–89 · background_work.v1 · e2adc9a3c325;aida-agent · packages/tool-client/src/types/runtime-v2.ts L204–218 · background-work: · e2adc9a3c325;aida-agent · packages/tool-client/src/types/runtime-v2.ts L232–247 · createBackgroundWorkCommand · e2adc9a3c325;aida-agent · packages/agent/src/runtime/work/background-work-policy.ts L7–47 · analytics.bi_query · e2adc9a3c325;aida-agent · packages/agent/src/runtime/work/background-work-policy.ts L60–68 · runSkillScript · e2adc9a3c325;aida-agent · packages/agent/src/runtime/work/background-work-policy.ts L115–173 · computeBackgroundToolPolicy · e2adc9a3c325;aida-agent · packages/tool-client/src/types/runtime-execution.ts L272–301 · workKind · e2adc9a3c325;aida-agent · packages/agent/src/runtime/work/run-work-execution-snapshot.ts L38–42 · loadBackgroundWorkExecutionSnapshot · e2adc9a3c325;aida-agent · docs/migration-drafts/tenant-resource-tiers-DRAFT.sql L10–14 · max_concurrent_background_runs · e2adc9a3c325;aida-agent · docs/migration-drafts/tenant-resource-tiers-DRAFT.sql L36–40 · max_concurrent_background_runs · e2adc9a3c325

证据与范围

  • aida-agent · packages/agent/src/index.ts L1092–1112 · test-only · e2adc9a3c325
  • aida-agent · packages/agent/src/index.ts L2433–2443 · executionWorker.start · e2adc9a3c325
  • aida-agent · packages/agent/src/runtime/execution/run-execution-worker.ts L69–70 · RunExecutionWorker · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/quota.ts L37–67 · TenantRateLimiter · e2adc9a3c325
  • aida-agent · packages/agent/src/gateway/redis-tenant-rate-limiter.ts L137–170 · createTenantRateLimiter · e2adc9a3c325
  • aida-agent · packages/agent/src/runtime/execution/run-claim-quota.ts L78–86 · tryReserveTenantRunSlot · e2adc9a3c325
  • aida-agent · packages/agent/src/runtime/execution/run-execution-storage.ts L531–541 · quota_bucket <> 'background' · e2adc9a3c325
  • aida-agent · packages/agent/src/runtime/execution/run-execution-worker.ts L403–415 · RUN_EXECUTION_BACKGROUND_CONCURRENCY · e2adc9a3c325
  • aida-agent · packages/agent/src/tenant/resource-policy.ts L369–413 · to_regclass · e2adc9a3c325
  • aida-agent · packages/agent/src/config/config-change-bus.ts L54–64 · publishConfigChange · e2adc9a3c325
  • aida-agent · packages/agent/src/llm/provider-limiter.ts L12–44 · LLM_BUSY · e2adc9a3c325

视图

  • main — 多实例共享状态与执行租约。
  • quota-claim — 一次领取怎样按配额桶判定(前台软上限 / 后台硬上限 / uncounted 不限)。

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

  • 本轮生产者证据:aida-agent · packages/agent/src/shared/background-work-tenant-policy.ts L3–20 · BACKGROUND_CAPABILITY_IDS · e2adc9a3c325;aida-agent · packages/agent/src/runtime/work/background-work-admission.ts L159–188 · admitBackgroundWorkInTx · e2adc9a3c325;aida-agent · packages/agent/migrations/186_background_open_roots_index.sql L56–70 · idx_agent_runs_background_open_roots · e2adc9a3c325

产品口径旁挂(非本页机制)

本主题讲多实例共享状态、租户配额桶与后台生产者——不是 MSP 的产品定义。MSP = 原中台算薪运维等能力入产品(≠单纯多租户),见 product-narrative(2026-10-29)。

LLM Credits(钉点 e2adc9a3c325)

  • 迁移 187 引入租户/用户 Credits 表与 identity …-llm-credits。
  • Gateway admitChatCredits / creditsExhaustedResponse 在 chat 受理路径扣减/拒绝。
  • 与 ADR-0095 配额桶正交:Credits 是 LLM 用量账,quota_bucket 是 Run 领取桶。生产开通与共享库执行 未核实。

代码证据

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

已核验实现

生产启动要求 CONFIG_DB_URL 和 CONFIG_ENC_KEY,InMemory 不再是运行时回退。

aida-agentpackages/agent/src/index.ts:1232–12407f2e519936b57902d4907ed8026fe1ecdd146e82符号:test-only
已核验实现

RunExecutionWorker 在 chat role 装配,不能把 Worker 职责等同独立 worker 部署。

aida-agentpackages/agent/src/index.ts:2625–26437f2e519936b57902d4907ed8026fe1ecdd146e82符号:workbenchExecution
aida-agentpackages/agent/src/runtime/execution/run-execution-worker.ts:72–737f2e519936b57902d4907ed8026fe1ecdd146e82符号:RunExecutionWorker
已核验实现

租户请求限额(RPM/RPD):配置 rateLimitRedisUrl 时由 RedisTenantRateLimiter 跨实例共享计数,Redis 出错时该次退回进程内 TenantRateLimiter;未配置时只用进程内 Map,多实例分别计数。限额值按租户解析:租户覆盖 → 档位 → 全局 QUOTA_TENANT_RPM/RPD。

aida-agentpackages/agent/src/gateway/redis-tenant-rate-limiter.ts:141–1747f2e519936b57902d4907ed8026fe1ecdd146e82符号:createTenantRateLimiter
aida-agentpackages/agent/src/gateway/quota.ts:42–967f2e519936b57902d4907ed8026fe1ecdd146e82符号:TenantRateLimiter
aida-agentpackages/agent/src/index.ts:2044–20517f2e519936b57902d4907ed8026fe1ecdd146e82符号:tenantRequestLimitsFromPolicy
已核验实现

Run 领取按配额桶(ADR-0095 MR5,c6e06da08):claimNextExecutableRun / Work carrier 领取按不可变的 agent_runs.quota_bucket 计数。foreground(会话顶层 turn)沿用单语句软上限(standard 2 / plus 4 / dedicated 8,可被租户覆盖;并发领取可短暂超出),并按该租户前台 running 数优先排序;uncounted(前台 child、scheduled、business task 等)不计不限,以免父等子死锁;background 才有硬上限:内置 1 / 2 / 4,候选行 SKIP LOCKED 后取 (execution_scope, tenant, background) 的 pg_try_advisory_xact_lock,拿不到即跳过,再用独立语句复核 running 数。无 fairness 配置时前台 FIFO 不限、后台仍按 standard=1。

aida-agentpackages/agent/src/runtime/execution/run-claim-quota.ts:120–1317f2e519936b57902d4907ed8026fe1ecdd146e82符号:tryReserveTenantRunSlot
aida-agentpackages/agent/src/runtime/execution/run-execution-storage.ts:413–4317f2e519936b57902d4907ed8026fe1ecdd146e82符号:tryReserveTenantRunSlot
aida-agentpackages/agent/src/index.ts:2623–26247f2e519936b57902d4907ed8026fe1ecdd146e82符号:tenantFairness
aida-agentpackages/agent/src/tenant/resource-policy.ts:67–1127f2e519936b57902d4907ed8026fe1ecdd146e82符号:maxConcurrentBackgroundRuns
已核验实现

后台工作生产者已合入(STA-33 MR6-B/C/D):执行与控制循环、模板报告/通知/队列原因、租户门控生产者。默认关——BACKGROUND_WORK_TENANT_POLICIES 按租户 enabled/biEnabled/longRunningCapabilityIds;未配置或未知租户=关;只能收窄内置 8 能力白名单。开启后,前台忙或长跑能力时只读 routed 查询可原子受理为已完成 conversation_turn 交接 + background_work.v1 root(回复「已收到,在后台处理。」);每会话最多 3 个活跃后台 root;本机执行范围/附件/插件/本地执行器永不进后台;BI 需 biEnabled。领取侧仍按配额桶硬上限;迁移 186 为未完成后台 root 建部分索引。

aida-agentpackages/agent/src/shared/background-work-tenant-policy.ts:3–227f2e519936b57902d4907ed8026fe1ecdd146e82符号:BACKGROUND_CAPABILITY_IDS
aida-agentpackages/agent/src/runtime/work/background-work-admission.ts:209–2387f2e519936b57902d4907ed8026fe1ecdd146e82符号:admitBackgroundWorkInTx
aida-agentpackages/agent/src/runtime/work/background-work-execution.ts:5–197f2e519936b57902d4907ed8026fe1ecdd146e82符号:BACKGROUND_EXECUTION_BUDGET_MS
aida-agentpackages/agent/migrations/186_background_open_roots_index.sql:56–677f2e519936b57902d4907ed8026fe1ecdd146e82符号:idx_agent_runs_background_open_roots
aida-agentpackages/agent/src/session/chat-submission-store.ts:1152–12017f2e519936b57902d4907ed8026fe1ecdd146e82符号:admitBackgroundWorkInTx
已核验实现

租户资源档位(tenant_resource_tiers / tenant_resource_overrides)仅有迁移草案 docs/migration-drafts,不在 migrations/(正式迁移链里没有这两张表);解析器用 to_regclass 探测表,表不存在时一律使用内置 standard 档。档位维护 API 仅平台超级管理员(super_admin 且不限定租户)。

aida-agentpackages/agent/src/tenant/resource-policy-limits.ts:3–167f2e519936b57902d4907ed8026fe1ecdd146e82符号:standard
aida-agentpackages/agent/src/tenant/resource-policy-resolver.ts:190–2357f2e519936b57902d4907ed8026fe1ecdd146e82符号:to_regclass
aida-agentdocs/migration-drafts/tenant-resource-tiers-DRAFT.sql:1–37f2e519936b57902d4907ed8026fe1ecdd146e82符号:草案
aida-agentpackages/agent/src/gateway/admin-tenant-resources.ts:43–507f2e519936b57902d4907ed8026fe1ecdd146e82符号:isPlatformSuperAdmin
条件路径

配置跨实例失效:管理后台写配置成功后 publishConfigChange 经 pg_notify(aida_config_changed) 广播,各实例 LISTEN 后执行本地失效(含租户资源策略缓存);通知失败不阻断写入,仍依赖 TTL 收敛。

LISTEN 侧装配与失败退化仅抽查 config-change-bus 与 resource-policy,未逐一核对所有缓存是否订阅。

aida-agentpackages/agent/src/config/config-change-bus.ts:1–127f2e519936b57902d4907ed8026fe1ecdd146e82符号:pg_notify
aida-agentpackages/agent/src/config/config-change-bus.ts:54–647f2e519936b57902d4907ed8026fe1ecdd146e82符号:publishConfigChange
已核验实现

模型供应商限流:LLM adapter 以 ProviderLimiter 包装模型调用(默认单供应商在途 16、RPM 不限、排队 64、等待 30s,可由 LLM_PROVIDER_* 环境变量调整);排队按前台 / 后台分两类各自计上限(总队列至多 2×maxQueue),出队前台优先、同类 FIFO,后台即使部署关闭等待超时也保留默认期限;排队满或超时返回 LLM_BUSY(“AIdaWork 当前繁忙”)背压。桶来自 ALS 里的 runQuotaBucket。

aida-agentpackages/agent/src/llm/provider-limiter.ts:16–487f2e519936b57902d4907ed8026fe1ecdd146e82符号:LLM_BUSY
aida-agentpackages/agent/src/llm/provider-limiter.ts:154–1647f2e519936b57902d4907ed8026fe1ecdd146e82符号:前台优先
aida-agentpackages/agent/src/llm/provider-limiter.ts:186–2067f2e519936b57902d4907ed8026fe1ecdd146e82符号:runQuotaBucket
已核验实现

MR6-A 后台工作命令合同(d3b4881b1):BackgroundWorkCommand 是 run 命令 union 里的 background_work.v1,严格 schema 冻结 origin run / invocation / 命令与请求摘要、输入消息边界、已接受路由、capability 指纹、effectCeiling=read_only、writeToolsAllowed=false、toolPolicy(background-read.v1,按 domain/name 排序且摘要绑定 capabilityId)、executionBudgetMs=600000、deadline 恰为受理后 2 小时;sourceFactRef 与 idempotencyKey 都是 background-work:<originRunId>,runId 不能等于 originRunId。createBackgroundWorkCommand 只做纯构造,受理与当前授权归 Work owner。MR6-B/C/D 已合入生产者(默认关,见生产者条)。

aida-agentpackages/tool-client/src/types/runtime-v2.ts:61–867f2e519936b57902d4907ed8026fe1ecdd146e82符号:background_work.v1
aida-agentpackages/tool-client/src/types/runtime-v2.ts:275–2897f2e519936b57902d4907ed8026fe1ecdd146e82符号:background-work:
aida-agentpackages/tool-client/src/types/runtime-v2.ts:322–3377f2e519936b57902d4907ed8026fe1ecdd146e82符号:createBackgroundWorkCommand
已核验实现

后台工具策略(background-work-policy.ts):只允许白名单 capability(hr/recruit/vms 查询类、onboarding 知识问答、analytics.bi_query),否则 BACKGROUND_CAPABILITY_NOT_ALLOWED;工具集合 = 该 capability 显式读工具列表 ∩ 当前已授权 Skill 声明的工具 ∩ 已挂载且 sideEffectLevel=read、风险判定 allow、租户可用、非插件、无需确认的工具,再排除 reply_user / askUser / collectStructuredInput / request_file_access / confirm / request_confirmation / runSkillScript;analytics.bi_query 只有显式 biBackgroundEnabled=true 才有工具(普通 Skill/工具权限不开启它);已冻结策略再与冻结集合取交集,摘要不符即 BACKGROUND_TOOL_POLICY_INVALID。

aida-agentpackages/agent/src/runtime/work/background-work-policy.ts:27–527f2e519936b57902d4907ed8026fe1ecdd146e82符号:analytics.bi_query
aida-agentpackages/agent/src/runtime/work/background-work-policy.ts:63–717f2e519936b57902d4907ed8026fe1ecdd146e82符号:runSkillScript
aida-agentpackages/agent/src/runtime/work/background-work-policy.ts:118–1767f2e519936b57902d4907ed8026fe1ecdd146e82符号:computeBackgroundToolPolicy
已核验实现

后台 root 的读侧:Work 视图新增可选 workKind=background_work.v1,带该标记的视图不得带 pendingFileRequest / carrierBinding / publicProcess(只暴露状态,不作前台或文件恢复 carrier);执行快照按 run_kind 分派到 loadBackgroundWorkExecutionSnapshot。

aida-agentpackages/tool-client/src/types/runtime-execution.ts:286–3157f2e519936b57902d4907ed8026fe1ecdd146e82符号:workKind
aida-agentpackages/agent/src/runtime/work/run-work-execution-snapshot.ts:50–547f2e519936b57902d4907ed8026fe1ecdd146e82符号:loadBackgroundWorkExecutionSnapshot
条件路径

租户资源档位草案(tenant-resource-tiers-DRAFT.sql)随 MR5 增加 max_concurrent_background_runs:档位表 NOT NULL、1–64,租户覆盖可空、1–64;草案未执行时解析器用内置档位。

草案文件;各环境是否建表未核。

aida-agentdocs/migration-drafts/tenant-resource-tiers-DRAFT.sql:10–147f2e519936b57902d4907ed8026fe1ecdd146e82符号:max_concurrent_background_runs
aida-agentdocs/migration-drafts/tenant-resource-tiers-DRAFT.sql:36–407f2e519936b57902d4907ed8026fe1ecdd146e82符号:max_concurrent_background_runs
条件路径

租户资源档位草案的执行状态:发版顺序文档把 tenant-resource-tiers 草案记为「未执行」;钉点仓库里没有它的执行记录(migrations/README 与 202 执行记录都没有)。

该文档写于 2026-10-14;没有记录不等于各库都没执行,库内实际状态读不到。

aida-agentdocs/release/rollback-and-release-order.md:29–297f2e519936b57902d4907ed8026fe1ecdd146e82符号:tenant-resource-tiers
已核验实现

LLM Credits(迁移 187)与 ADR-0095 quota_bucket 正交:前者是 LLM 用量账,后者是 Run 领取桶。

aida-agentpackages/agent/migrations/187_llm_credits.sql:1–307f2e519936b57902d4907ed8026fe1ecdd146e82符号:llm_credits
aida-agentpackages/agent/src/gateway/chat-credits.ts:27–387f2e519936b57902d4907ed8026fe1ecdd146e82符号:admitChatCredits