Skip to content

fix: discard draft replies invalidated by a correction - #25

Open
imxyanua wants to merge 16 commits into
EvoMap:mainfrom
imxyanua:codex/fix-distillation-correction
Open

imxyanua wants to merge 16 commits into
EvoMap:mainfrom
imxyanua:codex/fix-distillation-correction

Conversation

@imxyanua

@imxyanua imxyanua commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

Summary

A correction can remove the candidate while /conversation/distill is in flight, after the existing pre-request check. Its late reply is currently saved as a valid draft.

draft reply → candidate still current? → write local draft
           → candidate changed? → compensate only this candidate's write

Recheck after the response and after persistence. Local candidate provenance distinguishes a corrected draft from a same-id newer turn or another session. Restore live records displaced by the invalidated insertion without rolling back concurrent records or resurrecting a discarded same-id draft.

Evidence

  • Before: a correction during the pending POST returns drafted; a correction crossing the draft write retains a stale draft. At the 20-draft limit it can also lose an unrelated earlier draft.
  • After: late headless and agent-supplied replies return dropped. Tests preserve earlier drafts, same-id legacy records, newer turns, other sessions and explicit discard, including the capacity/replacement interaction.
  • Distillation, turn lifecycle and architecture tests: 53 passed on Windows Node 24.21.0; all eight hosts pack. No workload/timeout relaxation or real model/Proxy/Hub calls.

Merge Danger

Door: two-way

Adds optional local sourceCandidate metadata; existing drafts remain readable. Engine assets and publication authorization are unchanged.

Blast Radius: persistence

Compensation protects final local state. It cannot undo a Proxy request already accepted or guarantee a draft is never briefly visible while a write and correction cross. Restoring unrelated displaced records can exceed the old capacity cap to prevent a second data loss.

@cursor

cursor Bot commented Nov 2, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。

另有 2 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=25、head_sha="67191f56d55b5ea985d00ad9a8fcaafc50f371c3",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 67191f56d55b

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 2 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P3] 二次校验后仍存在竞态窗口,可能留下已被修正候选生成的草稿 — 二次校验与函数返回之间不是原子操作;候选可以在校验确认有效后、post 返回前被 correct...(truncated) · lib/app/distill-session.js · advisory_ad2f6e5fc9ac37d196b132f4
  • [P3] 并发晚到响应的补偿会复活更早候选的过期草稿 — 每次 post 只记录本次写入直接挤出的 displaced 草稿。若 A 写入后被修正,B 又替换了 A...(truncated) · ``lib/app/distill-session.js`` · advisory_52ac74dc055591c1a19bc1f7`

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 67191f56d55b

@forrestlinfeng forrestlinfeng left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review — changes requested (simplify after #26)

The race is real and the recheck via isCurrentCandidate has no false-positive risk of its own. The fix is over-built, though.

Major — design/proportion: ~25 lines of compensation logic sit inside post() (lib/app/distill-session.js:30-54), which now POSTs, saves and compensates, with nested closures and a displaced variable set from inside the update callback. Most of it exists to restore drafts evicted by the 20-draft cap, which #26 removes — so this becomes dead code. Restoring a same-id predecessor assumes the Hub reuses a distill_id for a different candidate, which looks speculative. Per docs/architecture.md, pure list rules belong in lib/distill/, not lib/app/.

Suggested: land #26 first, then reduce this to "recheck → if not current, remove this candidate's draft", extracted as one pure helper.

Minor

  • withoutDraft(drafts, null, now) is used as a prune-expired call (:38, :44-45) — an odd use of remove-by-id, and a no-op after #26.
  • return [...restore, ...kept] (:51) puts restored drafts first, renumbering the list; publish/discard <n> act on list numbers, so a user can act on the wrong draft.
  • A correction landing after the second check still leaves the draft (acknowledged) — this narrows the window rather than closing it.
  • The ~100 lines of tests mostly support the restore logic and would shrink with the simplification.

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。

另有 1 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=25、head_sha="035418794ad5c37ac6bda79ba5133569f6232a6a",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 035418794ad5

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 1 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P3] 后一个候选回滚时会恢复前一个已失效候选的草稿 — 补偿逻辑只判断 previous 是否属于当前被修正候选,没有确认它所属的更早候选是否仍然有...(truncated) · lib/distill.js · advisory_4e7a3df6c5146e200a340342

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 035418794ad5

@forrestlinfeng forrestlinfeng left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 2 — one simplification before merge

#26 is merged now, so this can rebase onto main. Fixed since round 1: draft order is preserved (withDraft replaces in place, flatMap restores in place), and the withoutDraft(null) prune is gone. 37/37 touched tests pass.

Before merge

  1. Drop the same-id restore (lib/app/distill-session.js:34-38, lib/distill.js:151-158). Restoring previous assumes the Hub reuses a distill_id for a different candidate; nothing in lib or docs shows that, and it can bring back a draft an earlier correction should have removed (the bot flagged this too). The rule we need is just "after the recheck, if the candidate is no longer current, remove the draft stamped with this candidate". If there is Hub evidence for id reuse, please link it instead.
  2. Normalise the draft list once. distill-session.js:36 and distill.js:157 call find / some / flatMap without the Array.isArray guard every other draft helper uses; a non-array drafts file throws inside the lock.

With (1), post() no longer needs previous assigned from inside the update callback or the outcome.draft mutation — please move the draft write + recheck into one helper so post() is back to a sequence of single-purpose calls. The ~105 lines of tests should shrink accordingly.

Nit: withDraft now keeps position on replacement, but test/distill.test.js has no unit assertion for it.

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。

另有 2 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=25、head_sha="ebc68e1c7fc4dbb8e439f1f6e2aab9edf7f48d85",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 ebc68e1c7fc4

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 2 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P3] 重叠补偿会复活更早候选的过期草稿 — withoutCorrectedDraft 无条件恢复本次写入前的 previous,只确认它不是当前被修正候选的草稿�...(truncated) · lib/distill.js · advisory_638a915220c7dbc5b579735f
  • [P3] 补偿写入失败可能被报告为 dropped,但过期草稿仍保留 — 草稿写入和候选校验跨两个存储,不具备原子性;补偿更新失败时,已经写入的失效草稿不...(truncated) · lib/app/distill-session.js · advisory_a33886c6ab8c2a0355d4952a

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 ebc68e1c7fc4

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。

另有 1 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=25、head_sha="60a6b2b90871fc54f255539b15b8c4bd9f58767b",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 60a6b2b90871

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 1 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P3] 补偿写入失败会遗留失效草稿,并可能仍返回 dropped — 草稿写入与候选校验分属两个 store。第一次 drafts.update 已发布草稿后,如果候选失效且第�...(truncated) · lib/app/distill-session.js · advisory_b2458c90d421a66fd2b62c24

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 60a6b2b90871

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,并发现 1 个已核验问题。

另有 2 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=25、head_sha="5167732b8088b237c196c78e5da8e5c9d02fbcd5",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 5167732b8088

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 2 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P2] 过期请求可能覆盖并删除较新候选的同 ID 草稿 — post 对候选的校验与 drafts.update(withDraft) 分属两个存储操作。若校验后 A 已失效、B 已保��...(truncated) · lib/app/distill-session.js · advisory_337bef926af1715c70ce031f
  • [P3] 并发补偿可能复活已失效候选的草稿 — 多个候选生成相同 draft.id 并交错失效时,补偿逻辑只按“当前正在清理的候选”判断草稿...(truncated) · lib/app/distill-session.js · advisory_d78f1f1f2d455a2f5558b0ff

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 5167732b8088

Comment thread lib/app/distill-session.js Outdated
async function post(ports, { sessionId, candidate }, args, usage, signal) {
const body = distillBody({ platform: ports.identity.agent, sessionId: taskSessionId(ports.identity, sessionId), candidate, args, usage });
const result = await ports.proxy.request('POST', '/conversation/distill', body, { timeoutMs: DISTILL_TIMEOUT_MS, signal });
if (!isCurrentCandidate(await ports.candidates.read(), sessionId, candidate)) return { status: 'dropped' };

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

候选失效会掩盖已成功的远端写入

🟠 严重程度:中(P2)
ports.proxy.request('POST', '/conversation/distill', ...) 已经完成后,新增检查会在解析响应前直接返回 {status: 'dropped'}。因此,即使 Proxy 返回可映射为 stored 的成功结果,调用方也会收到 dropped;而 distillText 又把它描述为 “nothing was sent”。远端 POST 实际已经发送并可能完成持久化,返回状态与已发生的副作用不一致。

Finding:finding_3bafd60f05ebb9f7133d1272

@cursor

cursor Bot commented Nov 4, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。

另有 2 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=25、head_sha="58f0c14d6f7ca93f3c707c3de65c30a12254ca82",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 58f0c14d6f7c

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 2 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P3] 过期请求可能覆盖并删除较新候选的同 ID 草稿 — 候选校验与草稿写入不在同一原子操作内。过期请求 A 在预检查后暂停,较新候选 B 可先写...(truncated) · lib/app/distill-session.js · advisory_4656a4aaa1adf53db44eb3e3
  • [P3] 候选二次校验后仍可能留下失效草稿 — 新增逻辑先在第 44 行确认候选仍是当前候选,再通过 saveDraft 的异步 drafts.update 写入草��...(truncated) · lib/app/distill-session.js · advisory_ed620a8488c010e1c61b5389

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 58f0c14d6f7c

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,并发现 2 个已核验问题。

无法定位到 diff 的已核验问题

postAgentGene 仍只按时间戳校验,可能把旧 Gene 发送给同时间戳的新候选

🟠 严重程度:中(P2)
当前 PR 将候选身份从仅比较 at 收紧为同时比较 at 和 turn,并已在 post 的草稿路径使用 isCurrentCandidate。但 postAgentGene 的入口校验仍是 claimed.candidate.at !== writtenFor,只比较时间戳。若旧 Gene ...(truncated)

Finding:finding_336b3d08f12014b26038e5bf · 文件:lib/app/distill-session.js · 详情:/api/v1/aiqa/findings/finding_336b3d08f12014b26038e5bf

agent Gene 的 writtenFor 仍只按时间戳校验

🟠 严重程度:中(P2)
本次 diff 将候选身份从仅比较 at 改为比较 at + turn,但 postAgentGene 的旧校验仍是 claimed.candidate.at !== writtenFor。当同一时间戳产生更新的 turn 时,旧 Gene 仍能通过 writtenFor 校验,并被发送给当...(truncated)

Finding:finding_ff245a4f89ef266ba5ef605a · 文件:lib/app/distill-session.js · 详情:/api/v1/aiqa/findings/finding_ff245a4f89ef266ba5ef605a

当前为 advisory 仓库:这些 item 会逐条保留,但不阻塞合并。

另有 3 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=25、head_sha="d00d39a91268cf8d6b531fdc57dbd8781b96904a",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 d00d39a91268

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 3 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P3] 候选校验结果可能在返回前失效,导致过期草稿永久保留 — saveDraft 先持久化草稿,再从独立的 candidates store 读取候选状态。如果该读取获得“仍有效...(truncated) · lib/app/distill-session.js · advisory_9b22b6aa32a42af7781347c7
  • [P3] 旧 Agent Gene 可被提交到同时间戳的新候选 — 本 PR 将候选身份收紧为 (at, turn),但 agentGene.writtenFor、sessionToDistill(..., at) 和 postAgentGe...(truncated) · lib/app/distill-session.js·advisory_63363559830cbe8e0a61f221`
  • [P3] 补偿清理失败会留下可继续发布的失效草稿 — saveDraft 先持久化草稿,再发现候选已失效;补偿删除失败时返回 cleanup_failed,但已写入�...(truncated) · lib/app/distill-session.js · advisory_0d0ab89482bc7140c93d139c

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 d00d39a91268

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 正在审核此变更,尚未形成最终结论。

Sentinel 审核中

  • 当前 PR 已进入 reviewer;这是进行中状态,不是绿色通过,也不是红色阻塞。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=25、head_sha="d4952d908b77808468fcaaf7c69062a87a26c544",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 d4952d908b77

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 正在审核此变更,尚未形成最终结论。

Sentinel 审核中

  • 当前 PR 已进入 reviewer;这是进行中状态,不是绿色通过,也不是红色阻塞。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=25、head_sha="d6f4cd2007aec69a65f13d46f179473c420db663",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 d6f4cd2007ae

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Sentinel 正在审核此变更,尚未形成最终结论。

Sentinel 审核中

  • 当前 PR 已进入 reviewer;这是进行中状态,不是绿色通过,也不是红色阻塞。
  • Review unit 数量: 1

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=25、head_sha="32a5c7c659a7c74d7017dd7cf3628553392fd4de",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 32a5c7c659a7

@cursor

cursor Bot commented Nov 4, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,并发现 1 个已核验问题。

无法定位到 diff 的已核验问题

声明仍接受数字 written_for,但运行时已无法处理旧格式

🔴 严重程度:高(P1)
当前 candidateReferenceOf() 生成的是 v1-... 字符串,而 postAgentGene() 最终只接受 candidates.referenceOf(sessionId, claimed.candidate) === writtenFor。但 MCP 工具 schema 仍明确允许 z.number().int(),且旧终端调用和旧 ...(truncated)

Finding:finding_02f63aeaf3c28e99284a411b · 文件:lib/app/distill-session.js · 详情:/api/v1/aiqa/findings/finding_02f63aeaf3c28e99284a411b

当前为 advisory 仓库:这些 item 会逐条保留,但不阻塞合并。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=25、head_sha="0eb59d35d0894cf37273b5d1374f9b5173dbda6a",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 0eb59d35d089

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Sentinel 正在审核此变更,尚未形成最终结论。

Sentinel 审核中

  • 当前 PR 已进入 reviewer;这是进行中状态,不是绿色通过,也不是红色阻塞。
  • Review unit 数量: 1

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=25、head_sha="f070a4918f1cf93e29a7f78fe7c9528b8da08aa8",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 f070a4918f1c

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。

另有 2 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=25、head_sha="792e4cbac7553022e8635ca7408ad6fcde6b40f8",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 792e4cbac755

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 2 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P3] 候选引用未包含 sessionEpoch,旧 Gene 可能命中新会话候选 — 本 PR 使用 sessionEpoch 区分会话文件清理前后的候选和草稿,但 candidateReferenceOf() 仅哈希 ...(truncated) · lib/runtime/store/file-stores.js·advisory_0698b5bfef2621b2453f78d7`
  • [P3] 草稿失效检查后仍可能提交已纠正或已丢弃的草稿 — 最终 publicationBlock() 只查询一次 correction 标记,返回后没有原子地确认草稿仍存在且来源��...(truncated) · lib/app/commands/drafts.js · advisory_3e7fccd73c654a3d5667ef3f

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 792e4cbac755

@evomap-aiqa-bot

evomap-aiqa-bot Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。

另有 9 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。

审核覆盖提示: 2 个 hunk/条目缺少完整输入;它们不作为 bug 报告。

开发 agent 查询详情: 调用 MCP 工具 sentinel_pr_review_context,传入 owner_repo="evomap/evolver-agent-plugin"、pr_number=25、head_sha="0d59f0263e637c30bfd832487c3e37c3db0a95b9",并按条目追加 finding_id 或 finding_key。

由 Sentinel 审核 · 目标提交 0d59f0263e63

@evomap-aiqa-bot

Copy link
Copy Markdown

Sentinel 保留了 9 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
开发 agent:请 review 以下 advisory,并逐条给出“已验证无风险 / 已修复 / 转为后续事项”的结论;不要只做整体确认。

  • [P2] 兼容校验接受旧数值引用,但执行路径不再识别 — 本 PR 将候选匹配改为 candidateReferenceOf() 生成的 v1-... 字符串,但 MCP schema 仍明确接受整��...(truncated) · lib/app/distill-session.js · advisory_7755e45c50a6f1391d284d1c
  • [P2] 旧会话不会初始化 sessionEpoch,纠正键仍可能跨会话冲突 — 新字段只在 session.turn === 0 时初始化。升级前的持久化会话已有非零 turn、但没有 sessionE...(truncated) · lib/session/state.js·advisory_d8ae7139bb08b84d4d9de9be`
  • [P3] now 可省略导致新会话没有 epoch — 新增的 sessionEpoch 直接取可选参数 now,但未提供默认值。首次打开且 session.turn === 0 时�...(truncated) · lib/session/state.js · advisory_85aa13073a6739a9a77abe1e
  • [P3] written_for 从时间戳改为不透明字符串但未保留旧格式兼容 — 本 PR 将报告返回的 written_for 从数字时间戳改为 v1-... 字符串,并明确让数字输入返回 “...(truncated) · test/channels/mcp.test.js · advisory_e266e9cd47497fb4a94df3a9
  • [P3] 候选引用遗漏 sessionEpoch,旧回复可命中新 epoch 的候选 — 当前性与草稿纠正逻辑携带 sessionEpoch,但对 Agent 暴露和认领的候选引用只哈希 sessionId��...(truncated) · lib/runtime/store/file-stores.js · advisory_0e348b7d4fd22a9a6c8658f2
  • [P3] sessionEpoch 并非生命周期必备状态 — 新会话初始化允许省略 now,旧会话恢复时也不补建 sessionEpoch,但纠正键和草稿匹配逻辑...(truncated) · lib/session/state.js · advisory_d8184dbc7b091b5f91c81a21
  • [P3] 候选引用未绑定 epoch,可重放到后续会话 — 会话状态引入 sessionEpoch 作为代际边界,但对外候选引用没有携带或校验该字段。候选标��...(truncated) · lib/app/distill-session.js · advisory_e5a57787a38ada4224871059
  • [P3] 旧格式候选引用通过校验后无法执行 — 兼容层仍接受旧版数值型 written_for,但后续执行路径已按新的不透明字符串解析。校验器�...(truncated) · lib/app/distill-session.js · advisory_c6605400f9b2ad3697e4774e
  • [P3] 纠正标记的写入路径在当前变更中不可见 — saveDraft() 检测到候选已过期时只调用 withoutCorrectedDraft() 删除草稿,没有写入 draftCorrectio...(truncated) · lib/app/distill-session.js·advisory_addd53e19d83335cba0e6389`

需要完整证据时,可用行末 finding_key 查询 Sentinel PR review context。

由 Sentinel 审核 · 目标提交 0d59f0263e63

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