临时-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 待对齐 |