oh-my-muse/design-docs/临时-05-market-agent物化执行plan.html
lili 2dde0a45ef docs(mvp): 八域交付盘点+1.0.0交付计划+收尾对齐
- 8域交付盘点(codex多实例+claude深盘、均亲验以代码+真测试为准)→收敛5类系统性病灶
- 新增 docs/mvp/1.0.0-交付计划.md:基准线A最小可用子集、8域对账矩阵、E0-E7 Epic分解、反假绿验证标准
- 进度总账加指针对齐(接口门completed≠端到端可闭环;可闭环严判完成度~55-65%)
- 临时-01~04归档删除(SSE/KB物化过程文档、结论已并入memory与各.agent)、大纲清理悬空引用、临时-05并入E4

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 22:09:24 -07:00

343 lines
23 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>临时-05 · Market Agent 物化执行 Plan人读图</title>
<style>
:root{
--bg:#0f1419; --panel:#1a2230; --ink:#e6edf3; --muted:#9fb0c3;
--pub:#c0392b; --pubbg:#2a1a1c; --ins:#27ae60; --insbg:#16271c;
--copy:#2ecc71; --warn:#b8860b; --warnbg:#2a2410; --line:#33415a;
--accent:#4aa3ff; --accentbg:#13243a; --gate:#d97706; --gatebg:#2a1d0e;
}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--ink);
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
line-height:1.6;padding:32px 20px 64px}
.wrap{max-width:1180px;margin:0 auto}
h1{font-size:26px;margin:0 0 4px;letter-spacing:.3px}
.sub{color:var(--muted);font-size:14px;margin-bottom:6px}
.oneliner{background:var(--accentbg);border:1px solid var(--accent);border-radius:10px;
padding:14px 18px;margin:18px 0 26px;font-size:15px}
.oneliner b{color:var(--accent)}
h2{font-size:18px;margin:34px 0 14px;padding-left:10px;border-left:4px solid var(--accent)}
.card{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:18px 20px;margin-bottom:18px}
/* 拷配置主图 */
.iso{display:grid;grid-template-columns:1fr 56px 1fr;gap:0;align-items:stretch;margin:8px 0}
.col{border-radius:12px;padding:16px}
.col.pub{background:var(--pubbg);border:1px solid var(--pub)}
.col.ins{background:var(--insbg);border:1px solid var(--ins)}
.col h3{margin:0 0 12px;font-size:15px}
.col.pub h3{color:#ff8a7a}
.col.ins h3{color:#6fe0a0}
.box{background:#0d141d;border:1px solid var(--line);border-radius:8px;padding:10px 12px;margin:8px 0;font-size:13px}
.box .t{font-weight:600;margin-bottom:3px}
.box .d{color:var(--muted);font-size:12px}
.box.live{border-color:var(--pub)}
.box.copy{border-color:var(--copy);box-shadow:0 0 0 1px rgba(46,204,113,.25) inset}
.box.copy .t{color:#6fe0a0}
.arrowcol{display:flex;flex-direction:column;align-items:center;justify-content:center;position:relative}
.bigarrow{font-size:30px;color:var(--copy);font-weight:700}
.arrowlbl{font-size:11px;color:var(--muted);text-align:center;margin-top:4px;max-width:54px}
.copyhint{font-size:11px;color:var(--copy);text-align:center;margin-top:8px;border-top:1px dashed var(--copy);padding-top:8px}
.verdict{margin-top:14px;background:var(--insbg);border:1px solid var(--ins);border-radius:8px;padding:12px 14px;font-size:13.5px}
.verdict b{color:#6fe0a0}
/* before/after 通用两栏 */
.ba{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.ba .bad{background:var(--pubbg);border:1px solid var(--pub);border-radius:10px;padding:14px}
.ba .good{background:var(--insbg);border:1px solid var(--ins);border-radius:10px;padding:14px}
.ba h4{margin:0 0 8px;font-size:14px}
.ba .bad h4{color:#ff8a7a}
.ba .good h4{color:#6fe0a0}
.ba ul{margin:6px 0 0;padding-left:18px;font-size:13px;color:var(--muted)}
.ba li{margin:4px 0}
.tag{display:inline-block;font-size:11px;padding:1px 7px;border-radius:10px;margin-left:6px;vertical-align:middle}
.tag.new{background:#3a1418;color:#ff8a7a;border:1px solid var(--pub)}
.tag.reuse{background:#16271c;color:#6fe0a0;border:1px solid var(--ins)}
.tag.gate{background:var(--gatebg);color:#f0b250;border:1px solid var(--gate)}
/* 授权门 before/after 决策链 */
.gateflow{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.gatecol{background:#0d141d;border:1px solid var(--line);border-radius:10px;padding:14px}
.gatecol.after{border-color:var(--gate)}
.gatecol h4{margin:0 0 10px;font-size:14px}
.gatecol.before h4{color:#ff8a7a}
.gatecol.after h4{color:#f0b250}
.gstep{font-size:13px;padding:6px 10px;border-radius:7px;margin:6px 0;background:#111a26;border:1px solid var(--line)}
.gstep.pass{border-color:var(--ins);color:#6fe0a0}
.gstep.fail{border-color:var(--pub);color:#ff8a7a}
.gstep.newpass{border-color:var(--gate);color:#f0b250;box-shadow:0 0 0 1px rgba(217,119,6,.2) inset}
.gstep .k{font-size:11px;color:var(--muted)}
/* 实现单元流 */
.units{display:flex;gap:0;align-items:stretch;flex-wrap:wrap}
.unit{flex:1;min-width:185px;background:#0d141d;border:1px solid var(--line);border-radius:10px;padding:14px;position:relative}
.unit.core{border-color:var(--pub);background:var(--pubbg)}
.unit.gatecore{border-color:var(--gate);background:var(--gatebg)}
.unit h4{margin:0 0 6px;font-size:14px}
.unit.core h4{color:#ff8a7a}
.unit.gatecore h4{color:#f0b250}
.unit .one{font-size:12px;color:var(--muted)}
.ufarrow{display:flex;align-items:center;font-size:22px;color:var(--accent);padding:0 5px}
/* 时序简版 */
.seq{font-size:13px}
.seq .step{display:flex;gap:10px;margin:7px 0;align-items:flex-start}
.seq .n{flex:none;width:22px;height:22px;border-radius:50%;background:var(--accentbg);border:1px solid var(--accent);
color:var(--accent);font-size:12px;display:flex;align-items:center;justify-content:center;font-weight:700;margin-top:1px}
.seq .who{flex:none;width:140px;color:var(--muted);font-size:12px}
.seq .what{flex:1}
.seq .sync{color:var(--copy);font-size:11px}
/* 决策表 */
table{width:100%;border-collapse:collapse;font-size:13px;margin-top:6px}
th,td{border:1px solid var(--line);padding:8px 10px;text-align:left;vertical-align:top}
th{background:#0d141d;color:var(--muted);font-weight:600}
.rec{color:#6fe0a0;font-weight:600}
/* 通用 */
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.note{font-size:12px;color:var(--muted);margin-top:6px}
.pill{display:inline-block;background:var(--warnbg);border:1px solid var(--warn);color:#e0c060;
font-size:11px;padding:1px 8px;border-radius:10px}
.pill.red{background:#3a1418;color:#ff8a7a;border-color:var(--pub)}
.foot{color:var(--muted);font-size:12px;margin-top:30px;border-top:1px solid var(--line);padding-top:14px}
@media (max-width:820px){.iso{grid-template-columns:1fr}.arrowcol{flex-direction:row;padding:8px 0}
.ba,.grid2,.gateflow{grid-template-columns:1fr}.units{flex-direction:column}.ufarrow{transform:rotate(90deg);padding:6px 0}}
</style>
</head>
<body>
<div class="wrap">
<h1>临时-05 · Market <span style="color:var(--copy)">Agent 物化</span> 执行 Plan</h1>
<div class="sub">拷配置 · installed 型 agent · 改授权门 · v1执行版待人类 review 后执行,本稿只读出代码)· 2026-06-26</div>
<div class="sub">配套正文:<code>临时-05-market-agent物化执行plan.md</code> 姊妹方向 <code>临时-04</code>KB D0-fork已闭环</div>
<div class="oneliner">
<b>一句话:</b>市场安装一个智能体后,槽位能绑进去(闸 A 已放宽),但 AI <b>运行时授权门一律拒</b> market 来源 agent——这是 agent 物化的<b>唯一真断点</b>
拍板方向:<b>①不 fork、拷配置</b>agent 无 KB 那类私有泄露向量:版本不可变 / 运行时不回读私有 prompt / config 即被授权出售的商品本体);
<b>②物化成 installed 型独立 agentconfig 拷自发布者)+ 改运行时授权门放行</b>。物化全在<b>安装侧同步</b>完成,无任何 fork / 发布侧异步 / 外部资源。
</div>
<!-- ============ 拷配置 vs fork ============ -->
<h2>为什么 agent 不 fork、只拷配置</h2>
<div class="card">
<div class="ba">
<div class="bad">
<h4>KB 为何必须 fork临时-04</h4>
<ul>
<li>市场对 knowledge 零依赖 → 上架<b>不 fork</b> 任何 dataset</li>
<li>发布者活 dataset <b>上架后还能继续加私有文档</b>KB 不冻结)</li>
<li>安装者共享活 dataset + 检索<b>整库返回</b> → 读到上架时不存在的私有 chunk</li>
<li>→ 逼出"发布侧 fork 一份只含公开快照的独立 dataset"(重活)</li>
</ul>
</div>
<div class="good">
<h4>✓ Agent 无泄露向量 → 拷下即交付</h4>
<ul>
<li>version 一经 active <b>即不可变</b>(改动只能开新版本行)</li>
<li>运行时<b>不回读</b>发布者私有 prompt只用版本冻结 config</li>
<li>config 本就是发布者<b>亲写、上架出售的商品本体</b>(拿到=交付,非泄露)</li>
<li>→ 安装侧<b>同步拷一份 config</b> 即可,无 fork / 无外部资源 / 无异步</li>
</ul>
</div>
</div>
<div class="iso" style="margin-top:14px">
<div class="col pub">
<h3>发布者域owner = 发布者)</h3>
<div class="box live">
<div class="t">发布者 muse_agent + active muse_agent_version</div>
<div class="d">configpromptTemplate / slotBindings / toolGrantIds / modelKey· 🔒 active 即不可变</div>
</div>
<div class="copyhint">↓ A-materialize安装侧同步拷 config无 fork·无外部资源·无异步</div>
</div>
<div class="arrowcol">
<div class="bigarrow"></div>
<div class="arrowlbl">拷配置<br>各拷各的<br>无共享副本</div>
</div>
<div class="col ins">
<h3>安装者域owner = 安装者)</h3>
<div class="box">
<div class="t">installed 型 muse_agent本人所有</div>
<div class="d">source_market_asset_id=assetIdV27 列已在、补 DO 映射)</div>
</div>
<div class="box copy">
<div class="t">⭐ active muse_agent_version</div>
<div class="d">config = <b>整体拷自发布者快照</b>(保完整性,不漏 modelKey/toolGrantIds</div>
</div>
<div class="box" style="border-color:var(--ins)">
<div class="t" style="color:#6fe0a0">运行时 requireVisibleAgent → 取本地 config</div>
<div class="d">🟢 命中物化 agentAI 任务可跑</div>
</div>
</div>
</div>
</div>
<!-- ============ 授权门 before/after核心 ============ -->
<h2>唯一断点运行时授权门改造trust boundary · 本 plan 最需严防)</h2>
<div class="card">
<div class="note" style="margin-top:0;margin-bottom:10px">
<code>MuseAiTaskServiceImpl.requireVisibleAgent:329-331</code> · 三入口 <code>:220</code>(agentTest)/<code>:308</code>(override)/<code>:315</code>(slotKey→binding) 全经它。改门一处 = 三入口同时通。
</div>
<div class="gateflow">
<div class="gatecol before">
<h4>✗ 改造前(断点②)</h4>
<div class="gstep pass">agentType = system <span class="k">→ 放行</span></div>
<div class="gstep pass">agentType = user 且 owner == 本人? <span class="k">→ 放行</span></div>
<div class="gstep fail">🔴 其余一律拒 AI_AGENT_SCOPE_FORBIDDEN<br><span class="k">market / installed 出身 agent 必拒 → 用户AI 任务直接失败</span></div>
</div>
<div class="gatecol after">
<h4>✓ 改造后A-runtime 放行 installed</h4>
<div class="gstep pass">agentType = system <span class="k">→ 放行(不回归)</span></div>
<div class="gstep pass">agentType = user 且 owner == 本人? <span class="k">→ 放行(不回归)</span></div>
<div class="gstep newpass">⭐ agentType = installed 且 owner == 本人 且 授权快照有效? <span class="k">→ 🟢 放行(新增支,三收紧点缺一不可)</span></div>
<div class="gstep fail">🔴 他人 installed / 无授权 / market 裸引用 仍拒 <span class="k">← 负路测命门</span></div>
</div>
</div>
<div class="verdict">
<b>放行三收紧点缺一不可:</b>①必须 installed 型(不放开 market 裸引用)②必须本人所有(防越权用他人 installed③授权快照有效防授权撤销后仍可跑
<b>A-verify 负路(他人 installed 必拒 / 授权失效必拒 / market 裸引用必拒)是本 plan 安全验收的命门——缺负路不算通过。</b>
</div>
</div>
<!-- ============ 五个实现单元 ============ -->
<h2>五个实现单元(各一句话)</h2>
<div class="card">
<div class="units">
<div class="unit core">
<h4>A-source <span class="tag new">扩端口</span></h4>
<div class="one"><b></b>临时-04 已落的 <code>MarketAssetSourceApi</code> 支持 assetType=agent + 带回发布者 active 版本 config决策点 D1market 反调 ai vs ai 自读)。</div>
</div>
<div class="ufarrow"></div>
<div class="unit">
<h4>A-materialize <span class="tag reuse">照搬 KB</span></h4>
<div class="one">绑定路径建本地 installed 型 muse_agent + active versionconfig 拷自发布者)+ 补 DO 映射 source_market_asset_id + 幂等 + 槽位指<b>本地 agentId</b>(去裸引用)。</div>
</div>
<div class="ufarrow"></div>
<div class="unit gatecore">
<h4>A-runtime <span class="tag gate">trust boundary</span></h4>
<div class="one"><code>requireVisibleAgent</code> 放行 installed 型 + 本人 + 授权有效;三入口同时通;<b>他人/无授权必拒</b></div>
</div>
<div class="ufarrow"></div>
<div class="unit">
<h4>A-naming</h4>
<div class="one">agent_type 取值统一market_installed / installed / installed_ref 四处漂移收口)+ 同步 后端-04。</div>
</div>
<div class="ufarrow"></div>
<div class="unit">
<h4>A-verify</h4>
<div class="one">真 PG ITinstall→物化→bind→runtime 命中物化 agent+ studio e2e + <b>授权门负路</b></div>
</div>
</div>
<div class="note" style="margin-top:12px">
复用 KB 已落资产:<span class="tag reuse">复用</span> <code>MarketAssetSourceApi</code>(扩,非新建)+ handoff token + <code>materializeInstalledRefKb</code> 物化形态。
不需要:<b>MarketKbListedEvent 孪生事件 / MarketAssetForkApi 写回 / 发布侧 fork 管线</b>agent 无 fork、物化全在安装侧同步
</div>
</div>
<!-- ============ 安装侧物化时序(同步) ============ -->
<h2>物化时序(安装侧同步 · 无异步 · 无外部调用)</h2>
<div class="card seq">
<div class="step"><div class="n">1</div><div class="who">用户</div><div class="what">市场安装 agent 资产install 只记账 targetFactsWritten=false不动→ 跳转 ai 槽位绑定</div></div>
<div class="step"><div class="n">2</div><div class="who">ai 绑定路径</div><div class="what">消费 handoff token闸 A 已放宽 market 型,不动)</div></div>
<div class="step"><div class="n">3</div><div class="who">A-source</div><div class="what">MarketAssetSourceApi 读资产来源 + 带回发布者 active 版本 configassetType=agent 放行)<span class="sync"> · 一次跨 BC 读,无外部服务</span></div></div>
<div class="step"><div class="n">4</div><div class="who">A-materialize</div><div class="what">同一 @Transactional 内:幂等查 → 建 installed 型 muse_agentagent_key 安装者维度唯一)<span class="sync"> · 同步</span></div></div>
<div class="step"><div class="n">5</div><div class="who">A-materialize</div><div class="what">建 active muse_agent_versionconfig 整体拷贝)→ 回写 current_version_id → 槽位 binding.agentId = 本地 installed agentId</div></div>
<div class="step"><div class="n">6</div><div class="who">A-runtime</div><div class="what">发起 AI 任务 → requireVisibleAgent 放行本地 installed agent → 取本地 config → 🟢 真跑出候选</div></div>
<div class="note" style="margin-top:10px">对照 KBKB 这里要等上架时异步 fork 副本 dataset 就绪(重活 + forkStatus fail-closedagent <b>全程同步、无外部调用、无中间态</b>——这是 agent 比 KB 轻得多的根本原因。</div>
</div>
<!-- ============ 决策点 ============ -->
<h2>关键决策点(待人类拍板)</h2>
<div class="card">
<table>
<thead><tr><th style="width:130px">决策</th><th>选项</th><th style="width:300px">倾向 + 理由</th></tr></thead>
<tbody>
<tr>
<td><b>D1 config 读取途径</b><br>(核心)</td>
<td>扩 MarketAssetSourceApi 让 market 反调 ai 读端口带 config ai 绑定路径自己读发布者 agent</td>
<td><span class="rec">market 反调 aiA</span>:安装侧调用对称 + 避免跨 owner 读难题代价market→ai 新方向)经 -api 端口+ArchUnit 可控。否决则退 B 显式处理跨 owner 读。</td>
</tr>
<tr>
<td><b>D2 拷 vs 引用</b><br>prompt 库</td>
<td>config 整体拷贝(含 promptTemplate 快照)/ 引用发布者 prompt 库</td>
<td><span class="rec">整体拷贝</span>agent 无泄露向量 + config 即商品本体 + 版本不可变→拷下即冻结快照;引用会重新引入发布者改 prompt 影响安装者的漂移。</td>
</tr>
<tr>
<td><b>D3 agent_type</b><br>命名最终值</td>
<td>market_installed installed installed_ref</td>
<td><span class="rec">market_installed</span>:与 后端-04 既有文档零漂移、语义自明;与 knowledge 风格协调即可不强求同名。</td>
</tr>
<tr>
<td>D4 授权快照承载</td>
<td>数值主键 字符串 envelopeVARCHAR</td>
<td><span class="rec">字符串 envelope</span>:沿用 ADR-020槽位 binding 已 V31 VARCHAR物化实体一致。</td>
</tr>
<tr>
<td>D5 installed agent<br>配额/列表可见</td>
<td>计入用户 agent 配额并列表可见 不计配额、列表单独分区或隐藏</td>
<td>倾向<span class="rec">列表可见标 installed 来源、配额随产品定</span>;非核心链路可后置,但 A-materialize 须明确列表查询是否纳入。</td>
</tr>
<tr>
<td>D6 DTO 形状</td>
<td>现有 DTO 增 agent 字段 拆 agent 专用 DTO+方法</td>
<td><span class="rec">拆 agent 专用</span>接口隔离KB/agent 各取所需,与临时-04 读写分离取向一致。</td>
</tr>
<tr>
<td>D7 召回/下架回滚</td>
<td>复用现有传播 本期标开放项</td>
<td>与 KB 同未触达面(临时-04 事实 7<span class="rec">倾向本期标开放项</span>不假装闭环A-runtime 授权失效兜底部分覆盖。</td>
</tr>
</tbody>
</table>
</div>
<!-- ============ 风险 + scope ============ -->
<h2>风险与边界(诚实呈现)</h2>
<div class="grid2">
<div class="card">
<h4 style="margin-top:0;color:#ff8a7a">主要风险</h4>
<ul style="font-size:13px;color:var(--muted);padding-left:18px;margin:6px 0">
<li><b style="color:var(--ink)">R1 改授权门 = trust boundary</b> <span class="pill red">必负路测</span>:最大风险是放过头(把"本人 installed"误放成任意/他人 installed/market 裸引用)。缓解:放行三收紧点 + A-verify 负路(他人/无授权/裸引用必拒)作验收命门。</li>
<li><b style="color:var(--ink)">R2 config 跨 BC 依赖方向D1</b>:选 A 引入 market→ai 新方向,需 ArchUnit 确认不成环。否决则退 B 显式处理跨 owner 读。</li>
<li><b style="color:var(--ink)">R3 config 拷贝完整性</b>:漏拷 modelKey/promptTemplate/toolGrantIds → 物化 agent 行为与发布者不一致(买到残品)。缓解:整体拷贝 + A-verify 真验。</li>
<li><b style="color:var(--ink)">R5 agent_key 唯一键冲突</b>uk_muse_agent_key=(tenant_id, agent_key),直拷发布者 agent_key 会撞键 500。缓解按安装者维度生成 agent_key幂等查走 source_market_asset_id。</li>
<li><b style="color:var(--ink)">R4 命名漂移收口</b>:写入值与放行值不一致 → 物化了运行时仍拒自造断点。缓解A-naming 单一常量 + 同步 后端-04。</li>
</ul>
</div>
<div class="card">
<h4 style="margin-top:0;color:#6fe0a0">本期不做Scope</h4>
<ul style="font-size:13px;color:var(--muted);padding-left:18px;margin:6px 0">
<li>KB 物化(临时-04 已闭环,不重做)</li>
<li>fork / 发布侧异步管线 / 上架事件 / 外部资源agent 无泄露向量、全免)</li>
<li>install 侧物化(维持只记账 targetFactsWritten=false</li>
<li>闸 A 槽位授权门(已放宽 market不碰</li>
<li>召回/下架回滚自动化(开放项,与 KB 同面,不假装闭环)</li>
<li>installed agent 列表/配额读模型D5 横切待定)</li>
<li>market 两列 BIGINT 契约议题</li>
</ul>
<div class="note">DDL 判定:<b>不引入新 Flyway 迁移</b>——source_market_asset_id 列 V27 已在、仅补 MuseAgentDO 映射;授权快照沿用 V31 VARCHAR。</div>
</div>
</div>
<!-- ============ 与 KB 异同 ============ -->
<h2>与 KB D0-fork 的异同(速览)</h2>
<div class="card">
<table>
<thead><tr><th style="width:150px">维度</th><th>KB临时-04已闭环</th><th>Agent本 plan</th></tr></thead>
<tbody>
<tr><td>泄露向量</td><td><b style="color:#ff8a7a"></b>(活 dataset 上架后能加私有文档→整库检索泄露)</td><td><b style="color:#6fe0a0"></b>version 不可变 + 不回读私有 prompt + config 即商品本体)</td></tr>
<tr><td>物化手段</td><td>fork 公开副本(建 dataset+复制+重索引,异步重活)</td><td><b style="color:#6fe0a0">拷配置</b>(安装侧同步拷 config无外部资源</td></tr>
<tr><td>发布侧工程</td><td>有(上架事件+消费者+兜底 worker+ForkApi 写回)</td><td><b style="color:#6fe0a0"></b>(物化全在安装侧、上架侧零改动)</td></tr>
<tr><td>唯一断点</td><td>检索第四门(数据正确即通,代码几乎不改)</td><td><b style="color:#f0b250">运行时授权门</b>(必改门放行 installedtrust boundary</td></tr>
<tr><td>改授权门</td><td>不改</td><td><b style="color:#f0b250"></b>A-runtime负路测命门</td></tr>
<tr><td>去污染/去裸引用</td><td>kb_id 去污染assetId→本地 kbId</td><td>槽位 agentId 去裸引用(发布者→本地 installed agentId</td></tr>
<tr><td>共享 vs 各拷</td><td>副本仅 1 份N 安装者共享只读</td><td>config 各拷各的,无共享(轻量 JSONB</td></tr>
<tr><td>外部资源回滚</td><td>有(删 fork 出的副本 dataset</td><td><b style="color:#6fe0a0"></b>(软删本地 agent 行即可)</td></tr>
<tr><td>共同开放项</td><td colspan="2">召回回滚未触达 installed 实体同面e2e fixture 待对齐</td></tr>
</tbody>
</table>
</div>
<div class="foot">
owner 边界引 临时-02§2.2 B' 智能体侧·§3.2 schema 增量)/ 临时-04KB 姊妹方向)/ 架构-02§5 智能体运行权限·§6 市场资产·§11.2 绑定授权·授权快照)/ ADR-017Source 传播事件驱动)/ ADR-020授权快照字符串承载/ .agents/rules/bc-boundaries.md本稿不重定义概念。
</div>
</div>
</body>
</html>