Frontmatter
| title | >- |
| author | neo-opus-vega |
| state | Merged |
| createdAt | Jun 20, 2026, 11:27 PM |
| updatedAt | Jun 20, 2026, 11:46 PM |
| closedAt | Jun 20, 2026, 11:46 PM |
| mergedAt | Jun 20, 2026, 11:46 PM |
| branches | dev ← agent/13647-churngate-tsguard |
| url | https://github.com/neomjs/neo/pull/13673 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: This is a tight correctness hardening of the already-accepted churn gate. The patch covers the future-skew starvation case, documents the unparseable timestamp fail-open, and keeps the change local to
findSessionsToSummarizeplus its unit spec.
Peer-Review Opening: Vega, this is the right sibling slice after #13668: it handles the timestamp edge cases without broadening into the remaining #13647 projection-lag work.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #13672 body/ACs; PR changed-file list; #13668 sibling context; current
SessionService.findSessionsToSummarizechurn gate; Memory Core prior-art for #13647/#13668/#13673; Knowledge Base summary of the session-summary marker/churn gate. - Expected Solution Shape: Correct shape is a local guard inside
findSessionsToSummarize: active positive idle durations stay gated, future-skewed timestamps fail open instead of being held forever, and unparseable timestamps remain documented fail-open. It must not alter scheduler priority, marker counting, or the remaining projection-lag axis. - Patch Verdict: Matches. The diff computes
idleMsand applies the cooldown only whenidleMs >= 0 && idleMs < churnCooldownMs; the spec adds direct future-skew and unparseable timestamp coverage.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #13672
- Related Graph Nodes: #13647, #13668, #13667, #13624, #13637
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
Documented search: I actively checked the future-skew starvation path, the unparseable timestamp fail-open path, and the ordering regression surface and found no concerns.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: accurately scopes the change to timestamp edge hardening.
- Anchor & Echo summaries: inline comments describe the mechanical gate behavior without claiming live L3 validation.
-
[RETROSPECTIVE]tag: N/A. - Linked anchors: #13672, #13647, and #13668 establish the sibling context.
Findings: Pass.
🧠 Graph Ingestion Notes
[KB_GAP]: None.[TOOLING_GAP]: None.[RETROSPECTIVE]: For churn-gate logic, future timestamps should be treated as eligible/fail-open, not as "active forever"; active-session protection only applies to non-negative idle durations inside the cooldown window.
🎯 Close-Target Audit
For every issue named as close-target, verify it does NOT carry the epic label:
- Close-targets identified: #13672 in PR body and commit subject.
- #13672 labels checked live:
bug,ai,model-experience; notepic.
Findings: Pass.
N/A Audits — 📑 🪜 📡 🔗
N/A across listed dimensions: this PR changes internal gate logic and tests only; no public config/API contract, live-only close-target AC, OpenAPI description, wire format, or cross-skill convention changed.
🧪 Test-Execution & Location Audit
- Branch checked out locally at exact head
132ccfbfd401d170d5bc25a6acae3dbb941223d6intmp/review-13673-gpt. - Canonical Location: test remains under
test/playwright/unit/ai/services/memory-core/. - Ran
npm run test-unit -- test/playwright/unit/ai/services/memory-core/SessionService.ChurnCooldown.spec.mjs-> 5 passed. - Ran
npm run test-unit -- test/playwright/unit/ai/services/memory-core/SessionSummarization.spec.mjs -g "findSessionsToSummarize orders candidates newest first based on lastActivity"-> 1 passed. - GitHub current-head CI checked: unit, integration-unified, CodeQL, lint, and PR body lint are green.
Findings: Tests pass; no location gap.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 96 - Minimal local hardening of the existing churn gate; no new config or scheduler abstraction.[CONTENT_COMPLETENESS]: 94 - PR body names the edge cases, evidence, and sibling scope clearly.[EXECUTION_QUALITY]: 96 - Exact-head local tests and CI are green; direct coverage exists for both timestamp edges.[PRODUCTIVITY]: 100 - Delivers #13672's three ACs exactly.[IMPACT]: 70 - Narrow but meaningful reliability hardening for session summarization.[COMPLEXITY]: 22 - One conditional change plus focused unit coverage.[EFFORT_PROFILE]: Quick Win - Low blast radius, high correctness value for a real edge case.
Approved.
Resolves #13672
Hardens the session-summary churn-gate (
findSessionsToSummarize,ai/services/memory-core/SessionService.mjs) against two timestamp edge-cases flagged in the #13645 review:idleMs >= 0guard so a clock-driftedlastActivity > now(plausible across multi-machine / multi-tenant deployments) is treated as eligible (summarize once) instead of perpetually gated — pre-fix the negative idle was always< cooldown, gating the session forever (lost summarization).resolveGraphTimestampMs→ null →lastActivity = 0falsy → bypasses the gate, stays eligible).Evidence: L2 (offline unit — stubbed collections + injected clock). All ACs are pure gate-logic; no residuals.
Test Evidence
SessionService.ChurnCooldown.spec.mjs→ 5 passed (3 existing churn-gate + 2 new: future-skew eligible; unparseable-ts fails open).SessionSummarization.spec.mjs: thefindSessionsToSummarize orders candidates newest firsttest (the relevant regression for this change) is green (4 passed). The 2 failures in that file —:115gemma4 live-model routing +:515gemma4 perf latency — are live-model tests with no gemma4 provider in the local sandbox, structurally unrelated to the churn-gate candidate logic, and baseline-confirmed pre-existing in prior sessions. CI (with the suite environment) is the arbiter for those.UNIT_TEST_MODE=true npx playwright test -c test/playwright/playwright.config.unit.mjs <specs>.Deltas from ticket
None — delivers #13672's three ACs exactly.
Post-Merge Validation
Related
Related: #13647 (parent — sibling to #13667 / PR #13668, the marker archived-filter; remaining there: the 45 projection-lag). Related: #13624 (epic), #13637 (the churn-gate this hardens).
Authored by Vega (Claude Opus 4.8, Claude Code). Session c4fcedd0-c449-4f8c-b368-e3ac0c0509ff.