Repository navigation
Conversation
|
Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。 GitHub CI 未通过。 此状态来自当前 CI gate,不是 Sentinel finding;请以最新 CI attempt 的日志为准。 另有 1 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 d59809bdcec7 |
|
Sentinel 保留了 1 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
需要完整证据时,可用行末 由 Sentinel 审核 · 目标提交 d59809bdcec7 |
|
Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。 另有 1 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 77d51a709526 |
|
Sentinel 保留了 1 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
需要完整证据时,可用行末 由 Sentinel 审核 · 目标提交 77d51a709526 |
forrestlinfeng
left a comment
There was a problem hiding this comment.
Code review — changes requested
The fix is right: the Hub is never posted to twice (the local-only path skips attemptOf, and withAttempt keeps the existing sentAt), and rejected / tier-none reports stay excluded.
Minor
- Retries are unbounded (8-day outbox expiry) and expensive.
recordReuseLocallyreturnsfalsefor "evolver-core can't be found" (lib/local-ledger.js:76-77), which is permanent, and the failure isn't cached; the fallback spawnsnpm root -gwith a 5 s timeout. So every drain, per sent entry missing its local record, repeats import + npm spawn while holding the outbox lock, for 8 days. Distinguish a permanent "no ingestor" from a transient failure, or cap local retries byattempts. - Idempotency gap: if
ingestwrites and then throws, the retry records the event twice (acknowledged in the description). - Predicate shape:
deliverPending(lib/reuse.js:134) builds the condition from a synthetic{ verdict: SENT }plus!entry.rejectedAt, which is redundant sincesentAtandrejectedAtnever co-occur. A namedisLocalRecordPending(entry)(or lettingattemptOfchoose the path) would read better. - Scope: the codex/workbuddy hook-test isolation changes are unrelated and clean up differently (
closeWhenSettled(proxy)vsproxy.close()); please move them to a separate PR.
|
Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。 GitHub CI 未通过。 此状态来自当前 CI gate,不是 Sentinel finding;请以最新 CI attempt 的日志为准。 另有 2 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 eabeb3df61d4 |
|
Sentinel 保留了 2 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
需要完整证据时,可用行末 由 Sentinel 审核 · 目标提交 eabeb3df61d4 |
|
Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。 GitHub CI 未通过。 此状态来自当前 CI gate,不是 Sentinel finding;请以最新 CI attempt 的日志为准。 另有 1 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 8767b36e470e |
|
Sentinel 保留了 1 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
需要完整证据时,可用行末 由 Sentinel 审核 · 目标提交 8767b36e470e |
|
Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。 另有 1 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 6a357968a250 |
|
Sentinel 保留了 1 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
需要完整证据时,可用行末 由 Sentinel 审核 · 目标提交 6a357968a250 |
forrestlinfeng
left a comment
There was a problem hiding this comment.
Round 2 — one cleanup before merge
Round-1 items look good: local retries are capped at 3 (MAX_LOCAL_FAILURES, lib/reuse.js:93,118-120), the predicate is now a named isLocalRecordDue(entry) without the synthetic { verdict: SENT }, and the idempotency gap is documented. Keeping the hook-test isolation here is fine now that it covers all four hosts consistently.
Before merge
- Commit history: eabeb3d reverts the hook-test change and 8767b36 re-adds it. Since this repo merges with merge commits, that churn would land on main — please squash/clean up the branch history.
Minor (can be in this PR or a follow-up)
lib/report-outbox.js:38relies onisLocalbeing tri-state (undefined/true/false) and mutateslocalafter building it. BuildinglocalFailuresin the same expression, or having the caller pass an explicitlocalFailed, would make it obvious.- Nit: the four new local
proxyvariables in the hook tests shadow the module-levelproxy.
|
Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。 另有 1 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 8d0794f3acc7 |
|
Sentinel 保留了 1 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
需要完整证据时,可用行末 由 Sentinel 审核 · 目标提交 8d0794f3acc7 |
8d0794f to
d0cfddd
Compare
|
Sentinel 已审核此变更,并发现 1 个已核验问题。 另有 2 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 d0cfddd316cd |
|
Sentinel 保留了 2 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
需要完整证据时,可用行末 由 Sentinel 审核 · 目标提交 d0cfddd316cd |
| assert.equal(Object.values(sent)[0].sentAt, NOW); | ||
| assert.equal(Object.values(sent)[0].localAt, undefined); | ||
| const up = ledgers(); | ||
| const recorded = await deliverPending(up, sent, NOW + 1); |
There was a problem hiding this comment.
锁超时测试的 mock 首次调用判断错误
🟠 严重程度:中(P2)
t.mock.method 调用 mock 实现前已计入本次调用,首次执行时 ingest.mock.callCount() 为 1 而非 0;因此 mock 不会抛出 LOCK_TIMEOUT,但测试随后断言 pending.localFailures === 1。
Finding:finding_db362c489393ca9c213c8664
|
Sentinel 已审核此变更,未发现已核验问题,但发现需要人工确认的风险。 GitHub CI 未通过。 此状态来自当前 CI gate,不是 Sentinel finding;请以最新 CI attempt 的日志为准。 另有 3 个需要人工确认的风险;黄色 advisory 不阻塞合并,建议开发 agent review advisory 评论并逐条确认。 开发 agent 查询详情: 调用 MCP 工具 由 Sentinel 审核 · 目标提交 283fd25c1863 |
|
Sentinel 保留了 3 个尚未确认的审核候选。这些黄色条目不阻塞合并;红色 P0/P1 与其他独立硬门禁不受影响。 单一猜测、缺少变更行证据或纯 checklist 的候选会统一降为 P3。
需要完整证据时,可用行末 由 Sentinel 审核 · 目标提交 283fd25c1863 |
Summary
When the Hub accepts a reuse report but the local ledger write fails, sentAt makes the entry settled and permanently skips the missing local evidence.
Keep terminal rejections and tier-none reports excluded, and never resend an accepted Hub report.
Evidence
Merge Danger
Door: two-way
No state schema changes. Existing sent entries without localAt become eligible for local-only retry.
Blast Radius: reporting
The existing eight-day outbox retention remains the retry horizon. Attempts includes local retry attempts; Hub delivery identity and rejection behavior are unchanged. Local recording and the outbox checkpoint remain separate writes: this patch does not claim exactly-once local events across a process crash or an ambiguous commit. The outbox serialization contract handles normal concurrent drains; worker-lock recovery is reviewed separately in #28.