Phase 3 — 统一装配(Assembly)设计草案 + 决策清单
Date: 2026-07-08 Status: 两个 blocking 决策已由用户拍板(2026-07-08) → 见 §2 定案。下一步补字段级设计(需先核实当前 /chat NestJS→agent 契约),再写实施计划。
✅ 定案摘要(用户 2026-07-08):
- D-2 placement = NestJS 组装 → 传结构化 prompt 给 agent 执行(与 E2 共存)。assembler 建在 NestJS(确定性组装:层序/优先级/token 预算/红线永不截断),产出结构化 prompt/context → 序列化跨服务传给 agent → agent 仍用 Hermes 生成 draft(agent 从「自己拼 prompt」变成「执行 NestJS 组装好的 prompt」)。依据:亲验 E2 phase-4.5 设计(主 checkout 的
2026-07-01-adr034-phase-4.5-design.md)——E2 phase-4.5 只迁 Expert consultation 的 chatStream,明确把主 draft pipelinerunAgentPipeline列为 non-goal/follow-up,主 draft 短期仍在 Hermes 。故 assembler 建 NestJS 与 E2 共存、为将来 E2 迁主 pipeline 铺路。需定义 NestJS assembler → agent 的新 prompt 契约。 - D-1 KB 契约 = 结构化 kb_context 升为主通道。与 D-2 自洽:KB 在 NestJS 侧,assembler 直接消费结构化 chunk(带 doc_id/chunk_id/isGolden/source)组装进 prompt,R5.1 强制引用 + P3.4 chunk-id trace 直接可实现。
- 翻转的改动面:Phase 3 从「agent 侧就地增强」翻转为「NestJS 建 assembler + 新 NestJS→agent prompt 契约 + agent 改成执行组装好的 prompt」。比 master plan 原设想大,需字段级设计。
基线: 已亲验 agent 侧装配现状 @
490517fb(见下"核实基线")。 Ancestry: master plandocs/superpowers/plans/2026-07-07-specialist-value-output-master-plan.md§四 Phase 3(P3.1-P3.5)+ §五 blocking 决策(N3/D3 placement)· R5.1-R5.5 · NFR3(分层预算 + 红线/身份永不截断)· ADR-034 E2(LlmService 迁移轨道)。
为什么这份文档存在:P2.4/P2.5 都有字段级设计可依,直接 subagent-driven 执行成功。Phase 3 只有 master plan 的任务级描述,亲验后发现落地要先回答几个跨 agent(Python)/NestJS(TS)的契约问题和一个战略 placement 决策——这些是 P2.4 keyword-service 返工的放大版风险(在错误契约上写完跨两服务的代码)。所以先出设计 + 停在决策点,而非盲目执行。
1. 核实基线(agent 侧装配现状,亲验)
| 维度 | 现状 | Phase 3 缺口 |
|---|---|---|
| prompt 组装 | 纯字符串拼接:prompts_loader.py:507 拼 system_prompt(security→clarify→attachment→web→soul→persona-header→role body),chat_helpers.py:430 再两级 \n\n join [system, directives, kb, web, request-ctx, history, inbound, docs, response_contract, clarity, user_msg] | P3.1:数据驱动层序 + 优先级表 + 统一 token 预算 + 红线/身份永不截断——基本新建 |
| 字符预算 | 3 个独立字符上限常量(DIRECTIVE_CHAR_LIMIT=1500/KB_CONTEXT_CHAR_LIMIT=4000/WEB_CONTEXT_CHAR_LIMIT=6000),各自截断 | P3.1:分层 token(非字符)预算,层间可按预算跳过,红线/身份豁免截断 |
| Soul 消费 | 两通道:per-request agent_context.specialist_system_prompt(NestJS resolveSpecialistPersona 下发)+ boot-time runtime-config 落 /opt/data/SOUL.md | P1 已就绪,Phase 3 复用 |
| persona heuristic | _FULL_TEMPLATE_SIGNALS(prompts_loader.py:400)仍在;P1.6 加了 header_only 软开关(默认 legacy),未物理删除 | 与 Phase 3 弱相关(ADR-033 过渡态) |
| skill 消费 | 零 runtime consumer——只有 _fetch_runtime_config_if_missing 落盘 RUNTIME_DATA_ROOT/skills/*,无读取/trigger/注入 | P3.2:全新建 skill 读取 + trigger 评估 + merge/tie-break + abstain |
| 检索级联 | 主要在 NestJS:pinGoldenFirst(P2.4,一次检索内置顶)+ maybeInjectCorrectionFewShot(flag-gated)+ hybrid,三段分散。agent 只在 kb_context_provided=false 走 keyword fallback | P3.3:三段收敛成按预算逐级跳过的编排,改动面主要 NestJS |
| KB 注入形态 | NestJS 把 KB 作为 history 的 user-role 轮注入(<kb_context> 包裹,非结构化);agent 结构化 format_kb_context/kb_context 字段只在 keyword fallback 生效 | 契约冲突,见 D-1 |
| trace | P0.6 minimal:draft metadata.assembly {promptVersion, templateKeySent, templateUsed, personaOverrideApplied, kbContextProvided, activeDirectivesCount} + agent audit。promptVersion = sha256(SOUL + role_template) | P3.4:扩 version_id(soul/skill)+ KB chunk ids + 逐层预算 + 独立表 + 90 天保留 |
| 红线检查 | 不存在——skill.redLines 字段无 runtime 消费;现有 post-draft 只有 path scrubber/echo-guard/PII(安全非业务红线) | P3.5:全新建,agent 出 draft 后检查 + NestJS flag 落 Expert workspace |
2. 两个 BLOCKING 决策(需用户/架构拍板)
D-1(契约级,必须先定):KB 怎么从 NestJS 传到 agent 侧 assembler
问题:P3.1 的「KB 强制引用」(R5.1)和 P3.4 的「KB chunk-id trace」要求 agent 侧 assembler 拿到带 id 的结构化 KB chunk。但现状 KB 主要作为 NestJS 注入的 history user-role 轮(非结构化文本,<kb_context> 包裹),agent 结构化 kb_context 字段只在 kb_context_provided=false 的 keyword fallback 生效。assembler 拿不到可引用/可追踪的 chunk。
| 选项 | 做法 | 优 | 劣 |
|---|---|---|---|
| D-1-A(倾向):结构化 kb_context 字段升为主通道 | NestJS 把已检索(golden+hybrid+correction)的 chunk 以结构化数组(带 doc_id/chunk_id/isGolden/source/content)放进 /chat 的 kb_context 字段传 agent;agent assembler 消费它做强制引用 + chunk-id trace;保留 history-轮作为兼容/展示 | assembler 拿到可引用可追踪 chunk,R5.1+P3.4 直接可实现;golden 置顶信息(isGolden)透传 | 改 /chat 契约 + NestJS 注入路径(P2.4 刚改过这块);两种注入形态并存需明确哪个是真相 |
| D-1-B:assembler 留 NestJS 侧 | 把 assembler 放 NestJS(KB 本就在这),agent 只收最终 prompt | KB 不用跨服务传 | 与 D-2(placement)强绑定,且 prompt 最终拼接、soul、persona heuristic 全在 agent——assembler 放 NestJS 要把这些也搬,改动面巨大;违反 master plan D3「短期 agent 侧」 |
推荐 D-1-A,但依赖 D-2 的 placement 结论(若 D-2 决定 assembler 长期迁 NestJS,则 D-1 的答案不同)。