Skip to content

fix(v1): normalize ref tag placement - #12

Merged
ranxianglei merged 1 commit into
ranxianglei:masterfrom
5258MF:2026-08-13_v1-ref-tag-normalization
Aug 13, 2026
Merged

fix(v1): normalize ref tag placement#12
ranxianglei merged 1 commit into
ranxianglei:masterfrom
5258MF:2026-08-13_v1-ref-tag-normalization

Conversation

@5258MF

@5258MF 5258MF commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

范围

这是原 PR #2 在当前 monorepo 上的替代版本,仅修复 OpenCode V1 适配器

  • 修改 packages/billion-context-opencode/src/messages-v1.ts 和 V1 system hook
  • 不修改 messages-v2.ts,也不对尚未验证的 OpenCode V2 宿主行为作结论
  • 保留原 PR 的 TAG ETIQUETTE 文案,改为仅由 V1 system hook 注入,避免让共享提示词错误描述 V2 行为

现象

PR #1 的就地 splice 修复生效后,kernel 渲染的 <acp tokens="N" type="text">mNNNNN</acp> 会真实进入 V1 模型输入。V1 重组逻辑原样复制这些前缀标签,包括 assistant 历史消息,因此模型会看到自己过去的回复带标签并可能模仿回显。

同时,user 标签位于正文行首,会占据正文开头的注意力位置。

修复

对齐 billion-context-pi 的成熟实现,仅在 V1 重组阶段处理标签:

  • patchRefTag:assistant 文本保持无标签;user 标签追加到正文末尾
  • rebuildBodyFromCore:当 kernel 改写正文时,使用改写后的正文重建 V1 text part;assistant 改写保留正文但不带标签,空正文改写也不会恢复旧内容
  • peelRefTagText / REF_TAG:只识别 kernel 实际生成的 XML 标签,不把用户正文开头的 [m12345] 当成旧标签剥除
  • V1 system hook 追加原 PR 中完全相同的 TAG ETIQUETTE 文案;共享 SYSTEM_PROMPT 和 V2 hook 均不改

ref 分配和 state.messageRefs 不变;dual-shape export、持久化状态以及 tool call/result 配对规则均不受影响。

验证

  • 新增 4 个 V1 测试:assistant 无标签、user 末尾标签、kernel 正文改写重建(覆盖 user、assistant 和空正文)、[mNNNNN] 防回归
  • npm run typecheck:通过
  • npm run test:30/30 通过
  • npm run build:通过
  • PR validation:通过
  • 针对实际 monorepo bundle 的 V1 smoke:通过

仓库现有根目录 smoke.mjs 仍引用重构前的 dist/index.js,而当前构建输出位于 packages/billion-context-opencode/dist/index.js;这是当前 master 的既有路径问题,本 PR 未扩大范围修改。

开发记录与审查

  • devlog/2026-08-13_v1-ref-tag-normalization/ 包含 REQ.mdWORKLOG.mdDESIGN.md
  • 已按 AGENTS.md 要求交由两名独立 Agent 审查;审查结论记录在 PR 评论中

@5258MF

5258MF commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

Dual-agent review

AGENTS.md §5.3,最终源代码已由两名相互独立的 Agent 审查。

  • Reviewer Agent 1 — APPROVE:确认提示词文案与原 PR fix: normalize ref tag placement on text parts (prevent model echo) #2 逐字一致且只注入 V1;messages-v2.ts 零差异;dual-shape export、持久化状态和 call/result pairing 均未触及。
  • Reviewer Agent 2 — APPROVE after fixes:初审发现 assistant kernel 正文改写和空正文改写两个边界;实现已修复,复审确认 assistant 改写保留正文但不带标签、空正文改写不恢复旧内容。

复审后的验证:npm run typecheck PASS、npm run test 30/30 PASS、npm run build PASS、git diff --check PASS、PR validation PASS,针对实际 monorepo bundle 的 V1 smoke PASS。

非阻断剩余风险:尚未运行真实 OpenCode V1 端到端;实现依赖当前 kernel XML ref-tag 格式。V2 明确不在本 PR 范围内。

@ranxianglei
ranxianglei merged commit cf8fa27 into ranxianglei:master Aug 13, 2026
3 checks passed
@ranxianglei ranxianglei mentioned this pull request Aug 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants