临时-05 · Market Agent 物化 执行 Plan

拷配置 · installed 型 agent · 改授权门 · v1(执行版,待人类 review 后执行,本稿只读出代码)· 2026-06-26
配套正文:临时-05-market-agent物化执行plan.md | 姊妹方向 临时-04(KB D0-fork,已闭环)
一句话:市场安装一个智能体后,槽位能绑进去(闸 A 已放宽),但 AI 运行时授权门一律拒 market 来源 agent——这是 agent 物化的唯一真断点。 拍板方向:①不 fork、拷配置(agent 无 KB 那类私有泄露向量:版本不可变 / 运行时不回读私有 prompt / config 即被授权出售的商品本体); ②物化成 installed 型独立 agent(config 拷自发布者)+ 改运行时授权门放行。物化全在安装侧同步完成,无任何 fork / 发布侧异步 / 外部资源。

为什么 agent 不 fork、只拷配置

KB 为何必须 fork(临时-04)

  • 市场对 knowledge 零依赖 → 上架不 fork 任何 dataset
  • 发布者活 dataset 上架后还能继续加私有文档(KB 不冻结)
  • 安装者共享活 dataset + 检索整库返回 → 读到上架时不存在的私有 chunk
  • → 逼出"发布侧 fork 一份只含公开快照的独立 dataset"(重活)

✓ Agent 无泄露向量 → 拷下即交付

  • version 一经 active 即不可变(改动只能开新版本行)
  • 运行时不回读发布者私有 prompt,只用版本冻结 config
  • config 本就是发布者亲写、上架出售的商品本体(拿到=交付,非泄露)
  • → 安装侧同步拷一份 config 即可,无 fork / 无外部资源 / 无异步

发布者域(owner = 发布者)

发布者 muse_agent + active muse_agent_version
config(promptTemplate / slotBindings / toolGrantIds / modelKey)· 🔒 active 即不可变
↓ A-materialize:安装侧同步拷 config(无 fork·无外部资源·无异步)
拷配置
各拷各的
无共享副本

安装者域(owner = 安装者)

installed 型 muse_agent(本人所有)
source_market_asset_id=assetId(V27 列已在、补 DO 映射)
⭐ active muse_agent_version
config = 整体拷自发布者快照(保完整性,不漏 modelKey/toolGrantIds)
运行时 requireVisibleAgent → 取本地 config
🟢 命中物化 agent,AI 任务可跑

唯一断点:运行时授权门改造(trust boundary · 本 plan 最需严防)

MuseAiTaskServiceImpl.requireVisibleAgent:329-331 · 三入口 :220(agentTest)/:308(override)/:315(slotKey→binding) 全经它。改门一处 = 三入口同时通。

✗ 改造前(断点②)

agentType = system? → 放行
agentType = user 且 owner == 本人? → 放行
🔴 其余一律拒 AI_AGENT_SCOPE_FORBIDDEN
market / installed 出身 agent 必拒 → 用户:AI 任务直接失败

✓ 改造后(A-runtime 放行 installed)

agentType = system? → 放行(不回归)
agentType = user 且 owner == 本人? → 放行(不回归)
⭐ agentType = installed 且 owner == 本人 且 授权快照有效? → 🟢 放行(新增支,三收紧点缺一不可)
🔴 他人 installed / 无授权 / market 裸引用 仍拒 ← 负路测命门
放行三收紧点缺一不可:①必须 installed 型(不放开 market 裸引用)②必须本人所有(防越权用他人 installed)③授权快照有效(防授权撤销后仍可跑)。 A-verify 负路(他人 installed 必拒 / 授权失效必拒 / market 裸引用必拒)是本 plan 安全验收的命门——缺负路不算通过。

五个实现单元(各一句话)

A-source 扩端口

临时-04 已落的 MarketAssetSourceApi 支持 assetType=agent + 带回发布者 active 版本 config(决策点 D1:market 反调 ai vs ai 自读)。

A-materialize 照搬 KB

绑定路径建本地 installed 型 muse_agent + active version(config 拷自发布者)+ 补 DO 映射 source_market_asset_id + 幂等 + 槽位指本地 agentId(去裸引用)。

A-runtime trust boundary

requireVisibleAgent 放行 installed 型 + 本人 + 授权有效;三入口同时通;他人/无授权必拒

A-naming

agent_type 取值统一(market_installed / installed / installed_ref 四处漂移收口)+ 同步 后端-04。

A-verify

真 PG IT(install→物化→bind→runtime 命中物化 agent)+ studio e2e + 授权门负路
复用 KB 已落资产:复用 MarketAssetSourceApi(扩,非新建)+ handoff token + materializeInstalledRefKb 物化形态。 不需要:MarketKbListedEvent 孪生事件 / MarketAssetForkApi 写回 / 发布侧 fork 管线(agent 无 fork、物化全在安装侧同步)。

物化时序(安装侧同步 · 无异步 · 无外部调用)

1
用户
市场安装 agent 资产(install 只记账 targetFactsWritten=false,不动)→ 跳转 ai 槽位绑定
2
ai 绑定路径
消费 handoff token(闸 A 已放宽 market 型,不动)
3
A-source
MarketAssetSourceApi 读资产来源 + 带回发布者 active 版本 config(assetType=agent 放行) · 一次跨 BC 读,无外部服务
4
A-materialize
同一 @Transactional 内:幂等查 → 建 installed 型 muse_agent(agent_key 安装者维度唯一) · 同步
5
A-materialize
建 active muse_agent_version(config 整体拷贝)→ 回写 current_version_id → 槽位 binding.agentId = 本地 installed agentId
6
A-runtime
发起 AI 任务 → requireVisibleAgent 放行本地 installed agent → 取本地 config → 🟢 真跑出候选
对照 KB:KB 这里要等上架时异步 fork 副本 dataset 就绪(重活 + forkStatus fail-closed);agent 全程同步、无外部调用、无中间态——这是 agent 比 KB 轻得多的根本原因。

关键决策点(待人类拍板)

决策选项倾向 + 理由
D1 config 读取途径
(核心)
扩 MarketAssetSourceApi 让 market 反调 ai 读端口带 config / ai 绑定路径自己读发布者 agent market 反调 ai(A):安装侧调用对称 + 避免跨 owner 读难题;代价(market→ai 新方向)经 -api 端口+ArchUnit 可控。否决则退 B 显式处理跨 owner 读。
D2 拷 vs 引用
prompt 库
config 整体拷贝(含 promptTemplate 快照)/ 引用发布者 prompt 库 整体拷贝:agent 无泄露向量 + config 即商品本体 + 版本不可变→拷下即冻结快照;引用会重新引入发布者改 prompt 影响安装者的漂移。
D3 agent_type
命名最终值
market_installed / installed / installed_ref market_installed:与 后端-04 既有文档零漂移、语义自明;与 knowledge 风格协调即可不强求同名。
D4 授权快照承载 数值主键 / 字符串 envelope(VARCHAR) 字符串 envelope:沿用 ADR-020,槽位 binding 已 V31 VARCHAR,物化实体一致。
D5 installed agent
配额/列表可见
计入用户 agent 配额并列表可见 / 不计配额、列表单独分区或隐藏 倾向列表可见标 installed 来源、配额随产品定;非核心链路可后置,但 A-materialize 须明确列表查询是否纳入。
D6 DTO 形状 现有 DTO 增 agent 字段 / 拆 agent 专用 DTO+方法 拆 agent 专用:接口隔离,KB/agent 各取所需,与临时-04 读写分离取向一致。
D7 召回/下架回滚 复用现有传播 / 本期标开放项 与 KB 同未触达面(临时-04 事实 7)→ 倾向本期标开放项,不假装闭环;A-runtime 授权失效兜底部分覆盖。

风险与边界(诚实呈现)

主要风险

  • R1 改授权门 = trust boundary 必负路测:最大风险是放过头(把"本人 installed"误放成任意/他人 installed/market 裸引用)。缓解:放行三收紧点 + A-verify 负路(他人/无授权/裸引用必拒)作验收命门。
  • R2 config 跨 BC 依赖方向(D1):选 A 引入 market→ai 新方向,需 ArchUnit 确认不成环。否决则退 B 显式处理跨 owner 读。
  • R3 config 拷贝完整性:漏拷 modelKey/promptTemplate/toolGrantIds → 物化 agent 行为与发布者不一致(买到残品)。缓解:整体拷贝 + A-verify 真验。
  • R5 agent_key 唯一键冲突:uk_muse_agent_key=(tenant_id, agent_key),直拷发布者 agent_key 会撞键 500。缓解:按安装者维度生成 agent_key,幂等查走 source_market_asset_id。
  • R4 命名漂移收口:写入值与放行值不一致 → 物化了运行时仍拒(自造断点)。缓解:A-naming 单一常量 + 同步 后端-04。

本期不做(Scope)

  • KB 物化(临时-04 已闭环,不重做)
  • fork / 发布侧异步管线 / 上架事件 / 外部资源(agent 无泄露向量、全免)
  • install 侧物化(维持只记账 targetFactsWritten=false)
  • 闸 A 槽位授权门(已放宽 market,不碰)
  • 召回/下架回滚自动化(开放项,与 KB 同面,不假装闭环)
  • installed agent 列表/配额读模型(D5 横切待定)
  • market 两列 BIGINT 契约议题
DDL 判定:不引入新 Flyway 迁移——source_market_asset_id 列 V27 已在、仅补 MuseAgentDO 映射;授权快照沿用 V31 VARCHAR。

与 KB D0-fork 的异同(速览)

维度KB(临时-04,已闭环)Agent(本 plan)
泄露向量(活 dataset 上架后能加私有文档→整库检索泄露)(version 不可变 + 不回读私有 prompt + config 即商品本体)
物化手段fork 公开副本(建 dataset+复制+重索引,异步重活)拷配置(安装侧同步拷 config,无外部资源)
发布侧工程有(上架事件+消费者+兜底 worker+ForkApi 写回)(物化全在安装侧、上架侧零改动)
唯一断点检索第四门(数据正确即通,代码几乎不改)运行时授权门(必改门放行 installed,trust boundary)
改授权门不改(A-runtime,负路测命门)
去污染/去裸引用kb_id 去污染(assetId→本地 kbId)槽位 agentId 去裸引用(发布者→本地 installed agentId)
共享 vs 各拷副本仅 1 份,N 安装者共享只读config 各拷各的,无共享(轻量 JSONB)
外部资源回滚有(删 fork 出的副本 dataset)(软删本地 agent 行即可)
共同开放项召回回滚未触达 installed 实体(同面);e2e fixture 待对齐
owner 边界引 临时-02(§2.2 B' 智能体侧·§3.2 schema 增量)/ 临时-04(KB 姊妹方向)/ 架构-02(§5 智能体运行权限·§6 市场资产·§11.2 绑定授权·授权快照)/ ADR-017(Source 传播事件驱动)/ ADR-020(授权快照字符串承载)/ .agents/rules/bc-boundaries.md,本稿不重定义概念。